如何从 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 作为参数传递给 mysqldumpmysqldump 也无法理解,从而导致错误。

您需要做的是设置您的子进程以重定向其输出。 Python 中的方法是:

with open('mytable.sql', 'w') as f:
  subprocess.call(['mysqldump',
                   '--single-transaction', 
                   '-u',
                   'myusername',
                   '-pmypasword', 
                   'mydb',
                   'mytable'], stdout=f)

subprocess.callstdout 参数允许您将子进程的输出定向到任何您喜欢的地方,就像 > 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

希望对您有所帮助