我的问题类似于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")
发布于 2022-03-11 14:39:23
您应该使用os.spawn*()
函数来创建新的进程。
下面是你的例子:
我们在path
上使用非阻塞标志os.P_NOWAIT
运行程序
最后两个参数给出了这个过程。(是的,如果你不熟悉,第一个参数应该是程序的路径,它被称为,然后是你的论点,谷歌'argv')
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")
发布于 2022-03-11 15:17:54
由于我既不挑拨离间,又不松懈,我什么也不能试验。但是,我会尝试使用进程创建标志来中断新进程和Python程序之间尽可能多的链接:
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)
https://stackoverflow.com/questions/71439704
复制相似问题