如何从 python 中执行复杂的外部命令?
How to execute a complicated external command from within python?
我想知道如何从内部执行复杂的外部命令python?
它在 linux bash 命令行中运行良好:
$ mysqldump --single-transaction -u myusername -pmypassword mydb mytable > mytable.sql
但它在 python 代码中不起作用:
subprocess.call(['mysqldump' '--single-transaction' '-u myusername' '-pmypasword' 'mydb' 'mytable' '>' 'mytable.sql'])
我的 python 代码有什么问题?
或者我必须使用 os.system() ??
请告诉我如何在 python 代码中工作,在此先感谢。
问题是 >
不是程序的命令行参数。 >
,在此上下文中,实际上是一个 shell 输出重定向运算符。它由 shell 本身处理,而不是由 mysqldump
程序处理。
Python的subprocess
对shell一无所知,所以无法理解shell运算符,如>
。它只是试图将 >
和 mytable.sql
作为参数传递给 mysqldump
,mysqldump
也无法理解,从而导致错误。
您需要做的是设置您的子进程以重定向其输出。 Python 中的方法是:
with open('mytable.sql', 'w') as f:
subprocess.call(['mysqldump',
'--single-transaction',
'-u',
'myusername',
'-pmypasword',
'mydb',
'mytable'], stdout=f)
subprocess.call
的 stdout
参数允许您将子进程的输出定向到任何您喜欢的地方,就像 >
shell 运算符一样。
看起来是语法错误,
subprocess.call(['mysqldump' '--single-transaction' '-u' 'myusername' '-pmypasword' 'mydb' 'mytable' '>' 'mytable.sql'])
缺少 '-u' 'myusername'
引号分隔。
此外,subprocess.run
在版本 >= 3.5 中替换了 subprocess.call
。检查 python subprocess.call API deprecation
这应该适合你。
这里是一个从内部执行复杂外部命令的例子python:
https://github.com/yokawasa/azure-shell
Azure-shell 是一个迭代的 Azure CLI 2.0 命令行界面,它在内部使用子进程
import subprocess
full_cmd = "external command"
p = subprocess.Popen(full_cmd, shell=True, env=self._env)
p.communicate()
这里的外部命令是az command(azure-cli 2.0),它有很多命令选项和参数,因此非常复杂。因此,azure-shell 支持自动完成 azure-cli 的命令选项和参数,帮助用户节省检查 azure cli 命令参考或键入 'az -h' 的时间。为了实现自动完成功能,它利用 python 提示工具包
https://github.com/jonathanslenders/python-prompt-toolkit
希望对您有所帮助
我想知道如何从内部执行复杂的外部命令python?
它在 linux bash 命令行中运行良好:
$ mysqldump --single-transaction -u myusername -pmypassword mydb mytable > mytable.sql
但它在 python 代码中不起作用:
subprocess.call(['mysqldump' '--single-transaction' '-u myusername' '-pmypasword' 'mydb' 'mytable' '>' 'mytable.sql'])
我的 python 代码有什么问题?
或者我必须使用 os.system() ??
请告诉我如何在 python 代码中工作,在此先感谢。
问题是 >
不是程序的命令行参数。 >
,在此上下文中,实际上是一个 shell 输出重定向运算符。它由 shell 本身处理,而不是由 mysqldump
程序处理。
Python的subprocess
对shell一无所知,所以无法理解shell运算符,如>
。它只是试图将 >
和 mytable.sql
作为参数传递给 mysqldump
,mysqldump
也无法理解,从而导致错误。
您需要做的是设置您的子进程以重定向其输出。 Python 中的方法是:
with open('mytable.sql', 'w') as f:
subprocess.call(['mysqldump',
'--single-transaction',
'-u',
'myusername',
'-pmypasword',
'mydb',
'mytable'], stdout=f)
subprocess.call
的 stdout
参数允许您将子进程的输出定向到任何您喜欢的地方,就像 >
shell 运算符一样。
看起来是语法错误,
subprocess.call(['mysqldump' '--single-transaction' '-u' 'myusername' '-pmypasword' 'mydb' 'mytable' '>' 'mytable.sql'])
缺少 '-u' 'myusername'
引号分隔。
此外,subprocess.run
在版本 >= 3.5 中替换了 subprocess.call
。检查 python subprocess.call API deprecation
这应该适合你。
这里是一个从内部执行复杂外部命令的例子python:
https://github.com/yokawasa/azure-shell
Azure-shell 是一个迭代的 Azure CLI 2.0 命令行界面,它在内部使用子进程
import subprocess
full_cmd = "external command"
p = subprocess.Popen(full_cmd, shell=True, env=self._env)
p.communicate()
这里的外部命令是az command(azure-cli 2.0),它有很多命令选项和参数,因此非常复杂。因此,azure-shell 支持自动完成 azure-cli 的命令选项和参数,帮助用户节省检查 azure cli 命令参考或键入 'az -h' 的时间。为了实现自动完成功能,它利用 python 提示工具包
https://github.com/jonathanslenders/python-prompt-toolkit
希望对您有所帮助