我有一个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
在后台完全运行脚本吗?
答案 0 :(得分:16)
&
是一个shell功能。如果您希望它与subprocess
一起使用,则必须指定shell=True
,如:
subprocess.call(command, shell=True)
这将允许您在后台运行命令。
注意:
自shell=True
以来,上述内容使用的是command
,而不是command_list
。
使用shell=True
启用所有shell的功能。除非command
包括thingy
来自您信任的来源,否则请勿这样做。
此备选方案仍允许您在后台运行该命令但是安全,因为它使用默认的shell=False
:
p = subprocess.Popen(command_list)
执行此语句后,该命令将在后台运行。如果您想确保它已完成,请运行p.wait()
。
答案 1 :(得分:0)
如果要在后台执行它,我建议您使用nohup
输出,该输出通常会进入终端,并进入名为nohup.out的文件
import subprocess
subprocess.Popen("nohup usr/local/bin/otherscript.pl {0} >/dev/null 2>&1 &", shell=True)
>/dev/null 2>&1 &
将不会创建输出,并将重定向到后台