我正在尝试将shell脚本移植到更易读的python版本.原始shell脚本在后台使用"&"启动多个进程(实用程序,监视器等).如何在python中实现相同的效果?我希望这些进程不会在python脚本完成时死掉.我确信它与守护进程的概念有某种关系,但我无法轻易找到如何做到这一点.
我正在尝试从python启动一个完全独立的进程.我不能使用像os.startfile这样简单的东西,因为我需要传递参数.目前我正在使用subprocess.popen,它让我90%的方式.
args = ["some_exe.exe", "some_arg", "another_arg"]
subprocess.Popen(args, creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
使用带有分离创建标志和std*管道的popen会启动一个新进程,该进程在父进程终止后继续存在.这一切都很好.问题是新的'子'进程仍然保留了父进程的幻象句柄.因此,如果我尝试卸载父exe(我的python脚本通过pyinstaller捆绑到exe),msiexec抱怨父exe仍在使用中.
因此,目标是生成一个完全独立的进程来运行"some_exe.exe",它没有任何句柄回原始进程.
注意:这适用于Windows XP及更高版本.我正在开发Win7.
我在Windows 8/XP上使用Python 2.7.
我有一个程序A使用以下代码运行另一个程序B:
p = Popen(["B"], stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate()
return
Run Code Online (Sandbox Code Playgroud)
B运行批处理脚本C. C是一个长时间运行的脚本,我希望B退出,即使C还没有完成.我使用以下代码完成了它(在B中):
p = Popen(["C"])
return
Run Code Online (Sandbox Code Playgroud)
当我运行B时,它按预期工作.然而,当我运行A时,我预计它会在B退出时退出.但是A等到C退出,即使B已经退出了.关于发生了什么以及可能的解决方案的任何想法?
不幸的是,将A改为看起来像B的明显解决方案不是一种选择.
以下是用于说明此问题的功能示例代码:https: //www.dropbox.com/s/cbplwjpmydogvu2/popen.zip?dl = 1
任何输入都非常感谢.