我的问题类似于How to run Python's subprocess and leave it in background,但是没有一个答案对我有用。
我试着运行一个程序,例如,Slack或Dis和合(或其他在问题更新中列出的程序)。我希望程序运行,即使我的脚本完成。
我需要这个在Windows上工作。
注意:这个问题只有在从Python脚本启动时才会发生,如果它以前运行过,那么它就不会关闭。
示例代码:(如您所见,我尝试了多种方法):
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.exe
、calc.exe
和winver
。
notepad.exe
和winver
的行为就像斯拉克和不和一样。但是,calc.exe
在脚本完成后仍保持打开状态(因此该程序的行为是异常的)。
代码:
subprocess.Popen(['notepad.exe'])
subprocess.Popen(['calc.exe'])
subprocess.Popen(['winver'])
更新2: --我需要以这种方式运行一些程序(包括Slack和because ),所以使用os.execl()
不会完成这项工作,因为它会立即退出python。
更新3:当我输入一个注释时,结果发现我在vscode中运行,并且在主脚本完成之后,vscode以某种方式关闭了进程。当我从Powershell运行Python脚本时,下面的大多数答案都会按需要工作。
发布于 2022-03-11 16:18:08
解决办法实际上比看起来容易得多:]
我们可以使用os.popen
在cmd/管道中运行命令,这将使那些进程不依赖于process!所以我们就这么做吧:
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
并使用它:
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")
https://stackoverflow.com/questions/71439704
复制相似问题