我想知道如何在python中执行复杂的外部命令?
在linux bash命令行中运行良好:
$ mysqldump --single-transaction -u myusername -pmypassword mydb mytable> mytable.sql
但它不能在python代码中工作:
subprocess.call([' mysqldump'' - 单一交易'' -u myusername'' -pmypasword'' mydb&# 39;' mytable'>'' mytable.sql'])
我的python代码出了什么问题?
或者我必须使用os.system()??
请提前告诉我如何在python代码中工作。
答案 0 :(得分:1)
它看起来是语法错误,
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
这应该适合你。
答案 1 :(得分:0)
问题是>
不是程序的命令行参数。在此上下文中,>
实际上是一个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)
stdout
的{{1}}参数允许您将子流程的输出定向到您喜欢的任何位置,就像subprocess.call
shell运算符一样。
答案 2 :(得分:0)
以下是从python中执行复杂外部命令的示例:
https://github.com/yokawasa/azure-shell
Azure-shell是一个迭代的Azure CLI 2.0命令行界面,它在内部使用子进程
{$divide:[
{$cond: { if: { $gte: [ {$mod:[{$multiply:['$dollarAmount',100]}, 1]}, 0.5 ] }, then: {$add: [{$subtract:[
{$multiply:['$dollarAmount',100]},
{$mod:[{$multiply:['$dollarAmount',100]}, 1]}
]}
,1]}, else: {$subtract:[
{$multiply:['$dollarAmount',100]},
{$mod:[{$multiply:['$dollarAmount',100]}, 1]}
]} }}
,
100]}
这里的外部命令是az命令(azure-cli 2.0),它有许多命令选项和参数,因此可能非常复杂。因此,azure-shell支持自动完成azure-cli的命令选项和参数,帮助用户节省检查azure cli命令参考或键入'az -h'的时间。为了实现自动完成功能,它利用了python prompt toolkit
https://github.com/jonathanslenders/python-prompt-toolkit
希望它会有所帮助