我希望脚本启动一个新进程,以便在初始脚本退出后新进程继续运行。我希望我可以使用multiprocessing.Process
来启动一个新进程,并设置daemon=True
,以便在创建的进程继续运行时主脚本可以退出。
但似乎第二个进程在主脚本退出时以静默方式终止。这是预期的行为,还是我做错了什么?
答案 0 :(得分:14)
来自Python文档:
当进程退出时,它会尝试 终止其所有守护儿童 过程
这是预期的行为。
答案 1 :(得分:10)
如果您使用的是unix系统,则可以使用os.fork:
import os
import time
pid=os.fork()
if pid:
# parent
while True:
print("I'm the parent")
time.sleep(0.5)
else:
# child
while True:
print("I'm just a child")
time.sleep(0.5)
运行此操作会创建两个进程。您可以在不杀死孩子的情况下杀死父母。 例如,当您运行脚本时,您将看到如下内容:
% script.py
I'm the parent
I'm just a child
I'm the parent
I'm just a child
...
使用ctrl-Z停止脚本:
^Z
[1]+ Stopped script.py
查找父级的进程ID号。它将是两个进程ID号中较小的一个,因为父对象是第一个:
% ps axuw | grep script.py
unutbu 6826 0.1 0.1 33792 6388 pts/24 T 15:09 0:00 python /home/unutbu/pybin/script.py
unutbu 6827 0.0 0.1 33792 4352 pts/24 T 15:09 0:00 python /home/unutbu/pybin/script.py
unutbu 6832 0.0 0.0 17472 952 pts/24 S+ 15:09 0:00 grep --color=auto script.py
杀死父进程:
% kill 6826
将script.py恢复到前台:
% fg
script.py
Terminated
您将看到子进程仍在运行:
% I'm just a child
I'm just a child
I'm just a child
...
用
杀死孩子(在新的终端)% kill 6827
答案 2 :(得分:8)
只需使用subprocess
模块:
import subprocess
subprocess.Popen(["sleep", "60"])
答案 3 :(得分:1)
这是一个关于SO的相关问题,其中一个答案为这个问题提供了一个很好的解决方案:
答案 4 :(得分:0)
如果您使用的是unix系统(using docs):
#!/usr/bin/env python3
import os
import sys
import time
import subprocess
import multiprocessing
from multiprocessing import Process
def to_use_in_separate_process(*args):
print(args)
#check args before using them:
if len(args)>1:
subprocess.call((args[0], args[1]))
print('subprocess called')
def main(apathtofile):
print('checking os')
if os.name == 'posix':
print('os is posix')
multiprocessing.get_context('fork')
p = Process(target=to_use_in_separate_process, args=('xdg-open', apathtofile))
p.run()
print('exiting def main')
if __name__ == '__main__':
#parameter [1] must be some file that can be opened by xdg-open that this
#program uses.
if len(sys.argv)>1:
main(sys.argv[1])
print('we can exit now.')
else:
print('no parameters...')
print('mother program will end now!')
sys.exit(0)