我想用multiprocessing模块来完成这个.
当我这样做时,像:
$ python my_process.py
Run Code Online (Sandbox Code Playgroud)
我启动一个父进程,然后让父进程生成一个子进程,
然后我希望父进程退出,但子进程继续工作.
请允许我写一个错误的代码来解释自己:
from multiprocessing import Process
def f(x):
with open('out.dat', 'w') as f:
f.write(x)
if __name__ == '__main__':
p = Process(target=f, args=('bbb',))
p.daemon = True # This is key, set the daemon, then parent exits itself
p.start()
#p.join() # This is WRONG code, just want to exlain what I mean.
# the child processes will be killed, when father exit
Run Code Online (Sandbox Code Playgroud)
那么,如何在父进程完成时启动一个不会被杀死的进程?
20140714
嗨,你们
我的朋友告诉我一个解决方案......
我只是想...
无论如何,只是让你看看:
import os
os.system('python your_app.py&') …Run Code Online (Sandbox Code Playgroud) 我试图在 FFmpeg 处于非 shell 子进程中时暂停它的编码(这对于它如何在更大的程序中发挥作用很重要)。这可以通过按下键盘上的“暂停/中断”键来完成,我正在尝试将其发送到 Popen。
命令本身必须是跨平台兼容的,因此我无法以任何方式包装它,但我可以根据需要发送信号或运行特定于平台的函数。
我研究了如何通过 pid 或处理程序向子进程发送“Ctrl+Break”,它建议发送信号,但这引发了“ValueError:不支持的信号:21”
from subprocess import Popen, PIPE
import signal
if __name__ == '__main__':
command = "ffmpeg.exe -y -i example_video.mkv -map 0:v -c:v libx265 -preset slow -crf 18 output.mkv"
proc = Popen(command, stdin=PIPE, shell=False)
try:
proc.send_signal(signal.SIGBREAK)
finally:
proc.wait()
Run Code Online (Sandbox Code Playgroud)
然后尝试使用GenerateConsoleCtrlEvent创建Ctrl+Break事件,如下所述https://learn.microsoft.com/en-us/windows/console/generateconsolectrlevent
from subprocess import Popen, PIPE
import ctypes
if __name__ == '__main__':
command = "ffmpeg.exe -y -i example_video.mkv -map 0:v -c:v libx265 -preset slow -crf 18 output.mkv"
proc = Popen(command, …Run Code Online (Sandbox Code Playgroud) 我在Windows上使用Python 3.4.2。在script1.py中,我这样做:
myProc = subprocess.Popen([sys.executable, "script2.py", "argument"])
myProc.communicate()
Run Code Online (Sandbox Code Playgroud)
它可以正常工作并调用script2.py。问题在于在script2.py中存在无限循环(必须存在),并且script1.py正在等待script2.py完成。我该如何告诉script1.py仅调用script2.py而不必等待该过程完成?
假设使用Linux:
在Perl中,该exec函数执行外部程序并立即退出,将外部程序保留在同一个shell会话中.
使用Python的一个非常接近的答案是/sf/answers/927983591/
但是,Python解决start_new_session=True方案使用setsid方法启动外部程序,这意味着该解决方案适用于制作守护程序,而不是交互式程序.
这是一个使用perl的简单示例:
perl -e '$para=qq(-X --cmd ":vsp");exec "vim $para"'
Run Code Online (Sandbox Code Playgroud)
启动vim后,原始Perl程序已退出,vim仍在同一个shell会话中(vim不会发送到新的会话组).
如何使用Python获得相同的解决方案.