我想从我的python脚本(main.py)启动一个进程,特别是我想运行下面的命令
`nohup python ./myfile.py &`
并且这个文件myfile.py应该在我的主要python脚本退出之后.
此外,我希望获得新流程的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继续打印一些文本:没有退出.
我在这里做错了吗?
解决方法:
您打开长时间运行的流程并保持管道.所以你希望与它交谈.当yor启动程序脚本退出时,您无法再与它通信.长时间运行的进程收到一个SIGPIPE并退出.
以下内容对我有用(Linux,Python 2.7).
创建一个长期运行的可执行文件
$echo "sleep 100" > ~/tmp/sleeper.sh
运行Python REPL:
$python
>>>
import subprocess
import os
p = subprocess.Popen(['/bin/sh', os.path.expanduser('~/tmp/sleeper.sh')])
# look ma, no pipes!
print p.pid
# prints 29893
退出REPL并看到进程仍在运行:
>>> ^D
$ps ax | grep sleeper
29893 pts/0 S 0:00 /bin/sh .../tmp/sleeper.sh
29917 pts/0 S+ 0:00 grep --color=auto sleeper
如果您想首先与已启动的流程进行通信,然后将其单独运行以进一步运行,您可以选择以下几种方法:
>在长时间运行的过程中处理SIGPIPE,不要死在它上面.启动程序进程退出后,没有标准输入.
>使用参数,环境或临时文件传递您想要的任何内容.
>如果要进行双向通信,请考虑使用命名管道(man mkfifo)或套接字,或编写适当的服务器.
>在最初的双向通信阶段完成后,使长时间运行的进程分叉.
标签:python,python-2-7,fork,subprocess,child-process
来源: https://codeday.me/bug/20190916/1808290.html