我正在使用subprocess.Popen启动带有参数的外部程序,但是当我打开它时,脚本正在挂起,等待程序完成,如果我关闭了脚本,则程序立即退出。
我以为我之前只是在使用类似的过程而没有任何问题,所以我不确定我是否确实做错了,或者我记错了Popen可以做什么。这是我调用命令的方式:
subprocess.Popen(["rv", rvFile, '-nc'])
raw_input("= Opened file")
仅在raw_input部分,因此用户有机会看到消息并知道应该立即打开文件。但是我最终得到的是过程本身吐出来的所有信息,就像直接在命令行中调用它一样。我的理解是Popen使它成为一个独立的子进程,这使我可以关闭脚本并使其他进程保持打开状态。
链接重复的问题对我来说确实有一个有用的答案,尽管它仍然无法按我希望的那样工作。
这就是答案。这就是我更改代码的方式:
DETACHED_PROCESS = 0x00000008
pid = subprocess.Popen(["rv", rvFile, '-nc'], creationflags=DETACHED_PROCESS).pid
raw_input("= Opened file")
它从IDLE运行,但是当我通过命令提示符样式界面运行py文件时,则无法运行。它仍然与该窗口绑定,在我运行脚本后立即打印输出并退出程序。
在Python中调用外部命令的可能重复
如果您认为找到了解决方案, 不要把它放在您的问题。 而是将其发布为答案(允许独立评论,投票,直接跳至答案)。
您可能应该重定向stdin,stdout,stderr(如果要忽略输出,则重定向到DEVNULL)
相关:Python:如何启动完整的过程而不是子过程并检索PID
@ J.F.Sebastian我可能不够清楚,但是我链接到的答案并未充分解决我的问题,即我确实通过合并答案来解决了问题,现在我应该就此回答,谢谢提醒!
抱歉,这么短的答案,但我还没有获得足够的积分来发表评论。无论如何,将raw_input("= Opened file")放在您实际打开的文件中,而不是您要从中打开文件的程序中。
如果您要打开的文件不是python文件,则无论您在python中声明什么,它都会在完成后关闭。如果是这种情况,您可以始终尝试使用以下方法将其与父项分离:
from subprocess import Popen, CREATE_NEW_PROCESS_GROUP
subprocess.Popen(["rv", rvFile, '-nc'], close_fds = True | CREATE_NEW_PROCESS_GROUP)
该文件实际上在其他程序中。该脚本基本上将视频列表编译为文件类型,然后在特定程序中将其打开。此解决方案再次在IDLE中有效,但在命令提示符中无效。我开始怀疑我打开的程序是否可能是问题。
如果我没看错,您想独立关闭生成的进程吗?为此,您将需要创建一个新的shell,shell = True。如果该解决方案在IDLE中有效,那么它将不是您的脚本,并且您可以确保代码正确。您如何运行命令提示符?是Windows调度程序提供的吗? (此外,摆脱raw_input)
它是python文件的手动运行,基本上是在Windows中双击python文件。但是结合使用DETACHED_PROCESS和shell确实可以实现我想要的功能,它使我可以关闭python脚本窗口,并使其他程序仍然运行。谢谢!
stackoverflow问题在python中调用外部命令有很多相关的有用答案。
看一下os.spawnl,它可以带有许多模式标志,包括NOWAIT,WAIT。
import os
os.spawnl(os.P_NOWAIT, 'some command')
NOWAIT选项将返回产生的任务的进程ID。
这是专门用于将python脚本作为命令行过程运行的,但是我最终通过结合人们建议的两个答案来使此工作正常进行。
使用此答案中建议的DETACHED_PROCESS的组合可通过IDLE(但命令行界面)运行它。但是使用shell = True(如ajsp所建议的)和DETACHED_PROCESS参数,它允许我关闭python脚本窗口并使其他程序保持运行。
DETACHED_PROCESS = 0x00000008
pid = subprocess.Popen(["rv", rvFile, '-nc'], creationflags=DETACHED_PROCESS, shell=True).pid
raw_input("= Opened file")
避免" python脚本窗口"看起来像是另一个问题(您可以使用.pyw文件扩展名或显式使用pythonw.exe运行脚本)。您应该添加close_fds=True(或重定向所有stdin,stdout,stderr)并摆脱shell=True。
仅Windows平台支持creationflags。 (那是我对python3.X的错误)