首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

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
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71439704

复制
相关文章

相似问题

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