繁体   English   中英

Python:subprocess.Popen() 返回 None

[英]Python: subprocess.Popen() returns None

我需要使用 args 执行 CLI 二进制文件,使进程保持活动状态并在整个 python 脚本中运行多个命令。 所以我通过以下方式使用 Python 和 subprocess.Popen() :

from subprocess import Popen, PIPE

cmd = ["/full/path/to/binary","--arg1"]
process = Popen(cmd,stdin=PIPE, stdout=None)
process.stdin.write(f"command-for-the-CLI-tool".encode())
process.stdin.flush()

但是,无论我如何调用 Popen(),返回的进程 object 都是None

如果我运行process = Popen(cmd) ,而不指定stdinstdout ,我可以在 output 控制台中看到进程正确运行,这意味着二进制路径和 args 是正确的,但进程 object 仍然是None ,这意味着我不能之后发出其他命令。

编辑:重点是我要执行以下操作:

command = (
        f"cat << EOF | {cmd}\n"
        f"use {dbname};\n"
        "set optimizer_switch='hypergraph_optimizer=on';\n"
        f"SET forced_plan='{forced_plan}';\n"
        f"{query_text}\n"
        "EOF"
    )
    runtimes = []
    for _ in trange(runs):
        start = time.time()
        subprocess.run(command, shell=True, stdout=sys.stdout)
        runtimes.append(time.time() - start)

但这清楚地测量了所有命令的时间,而我只对测量“query_text”命令感兴趣。 这就是为什么我正在寻找一种解决方案,我可以单独发送命令并只对我感兴趣的命令进行计时。如果我使用多个subprocess.run() ,那么流程实例将会不同。 我希望实例相同,因为查询取决于前面的命令。

使用subprocess.run您可以将整个输入作为... input传递。

    command = f"""\
use {dbname};
set optimizer_switch='hypergraph_optimizer=on';
SET forced_plan='{forced_plan}';
{query_text}
"""
    runtimes = []
    for _ in trange(runs):
        start = time.time()
        subprocess.run([cmd], text=true, input=command, stdout=sys.stdout)
        runtimes.append(time.time() - start)

我拿出shell=True 或许还可以参见Actual meaning of shell=True in subprocess 以及Running Bash commands in Python ,其中详细说明了此处的一些更改。

尝试使用subprocess.run()而不是subprocess.Popen()

如果你仍然使用 subprocess.Popen( subprocess.Popen() ,那么你可以使用.poll()方法

但是subprocess.Popen()将始终返回 None 如果命令的执行尚未完成,或者如果命令已完成执行则返回退出代码。

问题未解决?试试以下方法:

Python:subprocess.Popen() 返回 None

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM