【问题标题】:How to execute a complicated external command from within python?如何从 python 中执行复杂的外部命令?
【发布时间】:2017-08-15 09:39:17
【问题描述】:

我想知道如何在 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 代码中工作的,在此先感谢。

【问题讨论】:

    标签: python bash command subprocess external


    【解决方案1】:

    问题在于> 不是程序的命令行参数。 >,在这个上下文中,实际上是一个 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 运算符所做的那样。

    【讨论】:

    • 先生,您的解决方案完全正确,衷心感谢您!
    • 很高兴为您提供帮助!如果我的回答对您有帮助,请点赞并采纳:)
    • 嗨佩德罗,我尝试了很多次投票,但总是以失败告终,奇怪!我是不是做错了什么?
    • 知道了,stackoverflow说我的投票会被记录但不会公开显示,因为我是这里的新手,我的声望值不到15分。有趣!
    【解决方案2】:

    看起来是语法错误,

    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 这应该适合你。

    【讨论】:

    • 不行,这个错字更正后还是不行
    • 你是对的,它不起作用,我的错误。 Pedro 重定向到stdout 是正确的。已弃用的 subprocess.call 和错字仍然适用。
    【解决方案3】:

    这是一个在 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

    希望对你有帮助

    【讨论】:

    • 我不想为这个简单的要求导入更复杂的东西,os.system() 更容易,它是一个内置函数。还是谢谢。
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    相关资源
    最近更新 更多