在后台执行子进程

24

我有一个Python脚本,它接收输入并将其格式化为调用服务器上另一个脚本的命令,然后使用子进程执行:

import sys, subprocess

thingy = sys.argv[1]

command = 'usr/local/bin/otherscript.pl {0} &'.format(thingy)
command_list = command.split()
subprocess.call(command_list)

我在结尾添加了&,因为otherscript.pl需要一些时间来执行,而我更喜欢后台运行。不过,这个脚本似乎仍然在执行,没有将控制权还给我的shell,我必须等待执行完成才能返回提示符。有没有另一种使用subprocess完全在后台运行脚本的方法?


2
Popen比直接使用call更加灵活 - 需要更多的开销,但它可以提供你想要的控制。 - Mostly Harmless
2个回答

38

& 是一个 shell 特性。如果你想在 subprocess 中使用它,你必须像这样指定 shell=True

& 是一个 shell 特性。如果你想在 subprocess 中使用它,你必须像这样指定 shell=True

subprocess.call(command, shell=True)
这将允许您在后台运行命令。
注意:
1.由于shell=True,以上使用command而不是command_list
2.使用shell=True启用了所有shell的功能。除非来自可信源包括thingy在内的command,否则不要这样做。
更安全的替代方法
这种替代方法仍然可以让您在后台运行命令,但因为使用默认的shell=False所以更为安全:
p = subprocess.Popen(command_list)

执行此语句后,命令将在后台运行。如果您想确保命令已完成,请运行p.wait()


3
谢谢你!我一直看着人们使用Popen,但是pydoc详细介绍API的方式非常充实而且复杂。比我想象中简单得多。再次感谢! - dbishop

9

如果您想要在后台执行它,我建议您使用nohup。所有正常输出将被重定向到一个名为nohup.out的文件。

import subprocess

subprocess.Popen("nohup usr/local/bin/otherscript.pl {0} >/dev/null 2>&1 &", shell=True)

"

>/dev/null 2>&1 & 不会有输出,并将重定向到后台。

"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接