gpt4 book ai didi

python - 启动一个完全独立的进程

转载 作者:太空狗 更新时间:2023-10-29 16:53:30 29 4
gpt4 key购买 nike

我想从我的 python 脚本 main.py 启动一个进程。具体来说,我想运行以下命令:

`nohup python ./myfile.py &`

并且文件 myfile.py 应该继续运行,即使在 main.py 脚本退出后也是如此。

我也想得到新进程的pid

我试过:

  • os.spawnl*
  • os.exec*
  • subprocess.Popen

main.py 脚本退出时,所有这些都将终止 myfile.py


更新:我可以将os.startfilexdg-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 继续打印一些文本:没有退出。

我是不是做错了什么?

最佳答案

您打开长时间运行的进程并为其保留一个管道。所以你希望与它交谈。当您的启动器脚本退出时,您将无法再与其对话。 长时间运行的进程接收到 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) 或套接字,或者编写适当的服务器。
  • 在初始双向通信阶段完成后,让长时间运行的进程 fork 。

关于python - 启动一个完全独立的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27624850/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com