Gar*_*eld 16 python fork subprocess child-process python-2.7
我想从我的python脚本启动一个进程main.py,特别是我想运行下面的命令
`nohup python ./myfile.py &`
Run Code Online (Sandbox Code Playgroud)
这个文件myfile.py应该在我的主要python脚本退出之后.
另外,我希望得到main.py新流程.
我试过pid,os.spawnl*&os.exec*方法,subprocess.Popen如果我的main.py脚本退出,都会终止我的.
我可能会遗漏一些东西.
更新:我可以使用myfile.py同main.py?这是一种正确的方法吗?
例
a = subprocess.Popen([sys.executable, "nohup /usr/bin/python25 /long_process.py &"],\
stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
print a.pid
Run Code Online (Sandbox Code Playgroud)
如果我检查os.startfile,我看不到任何进程正在运行.
long_process.py继续打印一些文本:没有退出.
我在这里做错了吗?
900*_*000 14
您打开长时间运行的流程并保持管道.所以你希望与它交谈.当yor启动程序脚本退出时,您无法再与它通信.长时间运行的进程接收SIGPIPE并退出.
以下内容对我有用(Linux,Python 2.7).
创建一个长期运行的可执行文件
$ echo "sleep 100" > ~/tmp/sleeper.sh
Run Code Online (Sandbox Code Playgroud)
运行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
Run Code Online (Sandbox Code Playgroud)
退出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
Run Code Online (Sandbox Code Playgroud)
如果您想首先与已启动的流程进行通信,然后将其单独运行以进一步运行,您可以选择以下几种方法:
SIGPIPE长期运行的过程,不要死在它上面.启动程序进程退出后,没有标准输入.你可以用os.fork().
import os
pid=os.fork()
if pid==0: # new process
os.system("nohup python ./myfile.py &")
exit()
# parent process continues
Run Code Online (Sandbox Code Playgroud)
我看不到任何进程正在运行.
您没有看到任何进程正在运行,因为子python进程立即退出.该Popen参数是不正确的,@ user4815162342在注释中说.
要启动完全独立的进程,您可以使用python-daemonpackage或使用systemd/supervisord/etc:
#!/usr/bin/python25
import daemon
from long_process import main
with daemon.DaemonContext():
main()
Run Code Online (Sandbox Code Playgroud)
虽然在你的情况下可能就足够了,但要用正确的Popen参数启动孩子:
with open(os.devnull, 'r+b', 0) as DEVNULL:
p = Popen(['/usr/bin/python25', '/path/to/long_process.py'],
stdin=DEVNULL, stdout=DEVNULL, stderr=STDOUT, close_fds=True)
time.sleep(1) # give it a second to launch
if p.poll(): # the process already finished and it has nonzero exit code
sys.exit(p.returncode)
Run Code Online (Sandbox Code Playgroud)
如果子进程不需要,python2.5那么您可以使用sys.executable(使用与父进程相同的Python版本).
注意:代码DEVNULL在父级中关闭,而不等待子进程完成(它对子级没有影响).
| 归档时间: |
|
| 查看次数: |
30623 次 |
| 最近记录: |