如何从python中执行复杂的外部命令?

时间:2017-03-23 01:46:37

标签: python bash command subprocess external

我想知道如何在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代码中工作。

3 个答案:

答案 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

希望它会有所帮助