【问题标题】:python subprocess missing argumentspython子进程缺少参数
【发布时间】:2013-10-23 01:22:06
【问题描述】:

一直试图让这样的东西工作一段时间,下面似乎没有将正确的 arg 发送到 c 程序 arg_count,它输出 argc = 1。当我很确定我希望它是2 时。 ./arg_count -arg 从 shell 输出 2...

我已经尝试过使用另一个 arg(所以它会在 shell 中输出 3)并且在通过子进程调用时它仍然输出 1。

import subprocess
pipe = subprocess.Popen(["./args/Release/arg_count", "-arg"], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = pipe.communicate()
result = out.decode()
print "Result : ",result
print "Error : ",err

知道我摔倒在哪里了吗?顺便说一句,我正在运行 linux。

【问题讨论】:

    标签: python subprocess command-line-arguments


    【解决方案1】:

    来自documentation

    shell 参数(默认为 False)指定是否使用 shell 作为要执行的程序。如果 shell 为 True,则为 建议将 args 作为字符串而不是序列传递。

    因此,

    pipe = subprocess.Popen("./args/Release/arg_count -arg", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    

    应该给你你想要的。

    【讨论】:

    • 谢谢,这似乎解决了参数问题,但现在我没有任何输出......
    • 无论出于何种原因,脚本必须与可执行文件位于同一目录中才能获得有效结果?或者我不知道如何编写文件路径...
    • 不应该是这样的;我可以轻松地将我的 arg_count 版本(在本例中为 2 行 Python 脚本)放在不同的目录中并获得正确的结果。除非你的arg_count 本身有一些尴尬的问题。
    • 未与用作序列的选项的参数获得错误,但是当与args(-arg选项)配对的选项时,目标进程无法将选项分配给相应的参数(在我的中case 'Missing argument for option x') 使用您的解决方案并将 args 作为字符串传递,从而解决了问题
    【解决方案2】:

    如果shell=True 那么你的调用相当于:

    from subprocess import Popen, PIPE
    
    proc = Popen(['/bin/sh', '-c', "./args/Release/arg_count", "-arg"],
                 stdout=PIPE, stderr=PIPE)
    

    即,-arg 被传递给 shell 本身,而不是你的程序。删除shell=True 以将-arg 传递给程序:

    proc = Popen(["./args/Release/arg_count", "-arg"],
                 stdout=PIPE, stderr=PIPE)
    

    如果您不需要将stderrstdout 分开捕获,那么您可以使用check_output()

    from subprocess import check_output, STDOUT
    
    output = check_output(["./args/Release/arg_count", "-arg"]) # or
    output_and_errors = check_output(["./args/Release/arg_count", "-arg"],
                                     stderr=STDOUT)
    

    【讨论】:

      猜你喜欢
      • 2017-12-16
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 2018-09-06
      • 1970-01-01
      相关资源
      最近更新 更多