【问题标题】:Start another program and leave it running when the script ends启动另一个程序并在脚本结束时让它运行
【发布时间】:2015-05-05 11:30:13
【问题描述】:

我正在使用 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 文件时无效。它仍然与该窗口相关联,打印输出并在我运行脚本后立即退出程序。

【问题讨论】:

标签: python python-2.7 subprocess


【解决方案1】:

stackoverflow 问题Calling an external command in python 有很多相关的有用答案。

看看os.spawnl,它可以采用包括NOWAIT、WAIT在内的许多模式标志。

import os
os.spawnl(os.P_NOWAIT, 'some command')

NOWAIT 选项将返回衍生任务的进程 ID。

【讨论】:

    【解决方案2】:

    很抱歉这么简短的回答,但我还没有获得足够的积分离开 cmets。无论如何,请将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 脚本窗口并让其他程序仍在运行。谢谢!
    【解决方案3】:

    这专门用于将 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")
    

    【讨论】:

    • 避免“python 脚本窗口”看起来像是一个不同的问题(您可以使用 .pyw 文件扩展名或显式使用 pythonw.exe 运行您的脚本)。您应该添加close_fds=True(或重定向所有stdin、stdout、stderr)并去掉shell=True
    • creationflags 仅在 Windows 平台上受支持。 (这是python3.X的错误)
    猜你喜欢
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多