首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何启动另一个程序并在Python脚本完成后继续运行?

如何启动另一个程序并在Python脚本完成后继续运行?
EN

Stack Overflow用户
提问于 2022-03-11 14:02:28
回答 5查看 1.2K关注 0票数 1

我的问题类似于How to run Python's subprocess and leave it in background,但是没有一个答案对我有用。

我试着运行一个程序,例如,Slack或Dis和合(或其他在问题更新中列出的程序)。我希望程序运行,即使我的脚本完成。

我需要这个在Windows上工作。

注意:这个问题只有在从Python脚本启动时才会发生,如果它以前运行过,那么它就不会关闭。

示例代码:(如您所见,我尝试了多种方法):

代码语言:javascript
运行
复制
import os, subprocess
from time import sleep
from subprocess import Popen, PIPE, STDOUT

# discord_path=r"C:\Program Files\Discord\Discord.exe"
# discord_path2=r"C:\Users\user\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Discord Inc\Discord.lnk"
# os.startfile(discord_path2)

# subprocess.run([r"C:\Users\user\AppData\Local\Discord\Update.exe", "--processStart", "Discord.exe"],shell=True)
# subprocess.Popen([r"C:\Users\user\AppData\Local\Discord\Update.exe", "--processStart", "Discord.exe"],shell=True)
# subprocess.call([r"C:\Users\user\AppData\Local\Discord\Update.exe", "--processStart", "Discord.exe"])
# subprocess.Popen([r"C:\Users\user\AppData\Local\Discord\Update.exe", "--processStart", "Discord.exe"], stdin=None, stdout=None, stderr=None, close_fds=True)

# slack_path2=r"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Slack Technologies Inc\Slack.lnk"
# os.startfile(slack_path2)
#  stdin=None, stdout=None, stderr=None, 

# subprocess.Popen([r"C:\Program Files\Slack\slack.exe", "--startup"], close_fds=True)

proc = Popen([r"C:\Program Files\Slack\slack.exe", "--startup"], stdout=PIPE, stderr=STDOUT)

sleep(5)
# now program (Slack / Discord) is exited and I can't prevent it

更新:I还测试了notepad.execalc.exewinver

notepad.exewinver的行为就像斯拉克和不和一样。但是,calc.exe在脚本完成后仍保持打开状态(因此该程序的行为是异常的)。

代码:

代码语言:javascript
运行
复制
subprocess.Popen(['notepad.exe'])
subprocess.Popen(['calc.exe'])
subprocess.Popen(['winver'])

更新2: --我需要以这种方式运行一些程序(包括Slack和because ),所以使用os.execl()不会完成这项工作,因为它会立即退出python。

更新3:当我输入一个注释时,结果发现我在vscode中运行,并且在主脚本完成之后,vscode以某种方式关闭了进程。当我从Powershell运行Python脚本时,下面的大多数答案都会按需要工作。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2022-03-11 16:18:08

解决办法实际上比看起来容易得多:]

我们可以使用os.popen在cmd/管道中运行命令,这将使那些进程不依赖于process!所以我们就这么做吧:

代码语言:javascript
运行
复制
import os

os.popen("notepad.exe")
os.popen("notepad.exe")

print("Bye! Now it's your responsibility to close new process(es) :0")

this作为我的灵感来源,这个解决方案的工作方式有点不同。

只适用于窗口:

另外,如果您不想运行多个Popen(通过os.popen)来打开一个cmd.exe并使用它:

代码语言:javascript
运行
复制
import subprocess
from time import sleep

path = r"C:\Windows\System32\cmd.exe"
p = subprocess.Popen(
    [path],
    bufsize=-1,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    stdin=subprocess.PIPE)


def comunicate(process, message):
    process.stdin.write(message)
    process.stdin.flush()


comunicate(p, b'notepad.exe\n')
comunicate(p, b'notepad.exe\n')

sleep(0.1)
comunicate(p, b'exit\n')  # closes cmd

print("Bye! Now it's your responsibility to close new process :0")
票数 1
EN

Stack Overflow用户

发布于 2022-03-11 14:39:23

您应该使用os.spawn*()函数来创建新的进程。

下面是你的例子:

我们在path上使用非阻塞标志os.P_NOWAIT运行程序

最后两个参数给出了这个过程。(是的,如果你不熟悉,第一个参数应该是程序的路径,它被称为,然后是你的论点,谷歌'argv')

代码语言:javascript
运行
复制
import os

path = r"C:\Program Files\Slack\slack.exe"
os.spawnl(os.P_NOWAIT,        # flag
          path,               # programm
          path, "--startup")  # arguments

print("Bye! Now it's your responsibility to close new process :0")
票数 2
EN

Stack Overflow用户

发布于 2022-03-11 15:17:54

由于我既不挑拨离间,又不松懈,我什么也不能试验。但是,我会尝试使用进程创建标志来中断新进程和Python程序之间尽可能多的链接:

代码语言:javascript
运行
复制
from subprocess import Popen, CREATE_NEW_PROCESS_GROUP, DETACHED_PROCESS

proc = Popen([r"C:\Program Files\Slack\slack.exe", "--startup"],
             creationflags=CREATE_NEW_PROCESS_GROUP|DETACHED_PROCESS)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71439704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档