python打开另一个程序,关于python:启动另一个程序,并在脚本结束时使其运行

我正在使用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的错误)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值