【问题标题】:Use python to run shell script with Popen behaves differently in python command line and actual program使用 python 运行带有 Popen 的 shell 脚本在 python 命令行和实际程序中的行为不同
【发布时间】:2012-03-19 21:42:11
【问题描述】:

我有一个我想从 python 程序调用的 shell 脚本,但对于以下代码根本不起作用(Popen 已经导入):

bf_dir = '/home/wireless'
bf_path = os.path.join(bf_dir, 'airdispatch.sh')
sh = Popen("sudo " + bf_path, shell=True)
print sh.communicate()

理想情况下,脚本会生成输出文件,但是通过执行上面的代码,这些文件不会出现,“打印”结果是[None, None]。我的猜测是“Popen”不知何故根本没有被执行,或者可能是我在这里犯了一个错误。所以我在 python 命令行中运行上面的代码,但事实证明一切正常。这怎么可能?请帮忙,谢谢。

【问题讨论】:

    标签: python popen


    【解决方案1】:

    你没有从命令中得到任何输出的原因是你没有告诉子进程打开管道进行通信......

    from subprocess import Popen, PIPE
    
    sh = Popen("sudo %s" % bf_path, shell=True, stdout=PIPE, stderr=PIPE)
    

    现在,communication 将返回 stdout 和 stderr 的输出。此外,如果需要输入密码,sudo 可能会给您带来问题。

    【讨论】:

    • 据我所知,sudo 可能会这样工作 - 使用 'sudo apt-get update' 对其进行了测试,但它真的很混乱,因为你必须以纯文本形式编写密码。
    【解决方案2】:

    使用 shell=True 并调用 sudo 听起来有风险(look here),我宁愿将 Popen 与列表一起使用,而不是作为文本字符串。

    sh = Popen(['sudo', bf_path], shell=False, stdout=PIPE, stderr=PIPE)
    

    【讨论】:

    • 这是错误的。当您使用 shell 标志时,您可以传递一个字符串。您可能应该在投反对票之前将其删除。
    • 抱歉没有看到 shell-flag 只是知道我自己遇到了这个问题,因为 Popen 返回 [None, None] 并且它使用列表而不是空格分隔来解决自己字符串。
    • 可能是这样,但这个答案仍然是错误的,你应该删除它。您将其复制并粘贴到那里的 shell 标志。
    • 所以我认为应该摆脱它的错误声明,它应该可以工作
    猜你喜欢
    • 1970-01-01
    • 2013-08-21
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    相关资源
    最近更新 更多