[英]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)
,而不指定stdin
和stdout
,我可以在 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 如果命令的执行尚未完成,或者如果命令已完成执行则返回退出代码。
问题未解决?试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.