【发布时间】:2015-02-21 20:39:03
【问题描述】:
我想从我的 python 脚本main.py 启动一个进程。具体来说,我想运行以下命令:
`nohup python ./myfile.py &`
并且文件myfile.py 应该继续运行,即使在main.py 脚本退出之后。
我也想得到新进程的pid。
我试过了:
os.spawnl*os.exec*subprocess.Popen
当main.py 脚本退出时,所有人都在终止myfile.py。
更新:我可以将os.startfile 与xdg-open 一起使用吗?这是正确的方法吗?
示例
a = subprocess.Popen([sys.executable, "nohup /usr/bin/python25 /long_process.py &"],\
stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
print a.pid
如果我检查ps aux | grep long_process,则没有进程在运行。
long_process.py 继续打印一些文本:没有退出。
我在这里做错了吗?
【问题讨论】:
-
您能否发布一个无法正常工作的最小示例?在微不足道的
python -c 'import subprocess; subprocess.Popen(["sleep", "60"])'之后,ps的输出表明,sleep在 Python 退出后继续运行良好。 -
您正在运行带有单个参数
"nohup /usr/bin/python25 ..."的 Python,这无法正常工作,因为python可执行文件将在完全名为nohup /usr/bin/...的文件中查找脚本,该文件不存在。并且由于您将stderr指定为PIPE而不读取管道的内容,因此您永远不会看到错误消息。去掉nohup和&,直接运行subprocess.Popen([sys.executable, "/.../long_process.py"])。另外,除非您是认真的,否则不要将stdin和stderr指定为管道。 -
nohup在从 shell 启动进程时最有意义。我在您的Popen通话中没有看到shell=True。
标签: python python-2.7 subprocess fork child-process