启动另一个程序并在脚本结束时将其保留 运行
Start another program and leave it running when the script ends
我正在使用 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 文件时不起作用。它仍然与 window 相关联,打印输出并在我 运行 脚本后立即退出程序。
Whosebug 问题 Calling an external command in python 有很多相关的有用答案。
看看os.spawnl
,它可以采用多种模式标志,包括NOWAIT、WAIT。
import os
os.spawnl(os.P_NOWAIT, 'some command')
NOWAIT 选项将 return 派生任务的进程 ID。
很抱歉这么简短的回答,但我还没有获得足够的积分来发表评论。无论如何,将 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)
这是专门针对 运行 将 python 脚本作为命令行进程的,但我最终通过结合人们建议的两个答案使它起作用。
使用 this answer 中建议的 DETACHED_PROCESS 组合对 运行 它通过 IDLE 有效,但命令行界面。但是使用 shell=True(如 ajsp 建议的那样) 和 DETACHED_PROCESS 参数允许我关闭 python 脚本 window 和保持其他程序不变 运行.
DETACHED_PROCESS = 0x00000008
pid = subprocess.Popen(["rv", rvFile, '-nc'], creationflags=DETACHED_PROCESS, shell=True).pid
raw_input("= Opened file")
我正在使用 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 文件时不起作用。它仍然与 window 相关联,打印输出并在我 运行 脚本后立即退出程序。
Whosebug 问题 Calling an external command in python 有很多相关的有用答案。
看看os.spawnl
,它可以采用多种模式标志,包括NOWAIT、WAIT。
import os
os.spawnl(os.P_NOWAIT, 'some command')
NOWAIT 选项将 return 派生任务的进程 ID。
很抱歉这么简短的回答,但我还没有获得足够的积分来发表评论。无论如何,将 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)
这是专门针对 运行 将 python 脚本作为命令行进程的,但我最终通过结合人们建议的两个答案使它起作用。
使用 this answer 中建议的 DETACHED_PROCESS 组合对 运行 它通过 IDLE 有效,但命令行界面。但是使用 shell=True(如 ajsp 建议的那样) 和 DETACHED_PROCESS 参数允许我关闭 python 脚本 window 和保持其他程序不变 运行.
DETACHED_PROCESS = 0x00000008
pid = subprocess.Popen(["rv", rvFile, '-nc'], creationflags=DETACHED_PROCESS, shell=True).pid
raw_input("= Opened file")