我正在使用subprocess.Popen来启动带参数的外部程序,但是当我打开它时,脚本挂起,等待程序完成,如果我关闭脚本,程序会立即退出。
我以为我之前只是使用类似的过程而没有问题,所以我不确定我是否真的做错了或者我错误地记得Popen能做什么。这就是我调用命令的方式:
subprocess.Popen(["rv", rvFile, '-nc'])
raw_input("= Opened file")
raw_input部分仅在那里,因此用户有机会看到该消息并知道该文件应该立即打开。但是我最终获得的是进程本身正在吐出的所有信息,就好像它是直接在命令行中调用一样。我的理解是,Popen将它作为一个独立的子进程,允许我关闭脚本并让其他进程保持打开状态。
链接的重复问题确实对我的目的有一个有用的答案,尽管它仍然无法正常工作。
This is the answer.这就是我改变代码的方式:
DETACHED_PROCESS = 0x00000008
pid = subprocess.Popen(["rv", rvFile, '-nc'], creationflags=DETACHED_PROCESS).pid
raw_input("= Opened file")
它可以在IDLE中运行,但在我通过命令提示符样式界面运行py文件时却不行。它仍然与该窗口绑定,打印输出并在我运行脚本后立即退出程序。
答案 0 :(得分:1)
stackoverflow问题Calling an external command in python有很多有用的答案。
看一下os.spawnl
,它可以采用多种模式标志,包括NOWAIT,WAIT。
import os
os.spawnl(os.P_NOWAIT, 'some command')
NOWAIT选项将返回生成任务的进程ID。
答案 1 :(得分:1)
很抱歉这么简短的回答,但我还没有得到足够的积分来发表评论。无论如何,将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)
答案 2 :(得分:0)
这是专门用于将python脚本作为命令行进程运行的,但我最终通过结合人们建议的两个答案来实现这一点。
使用this answer中建议的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")