我的問題類似于How to run Python's subprocess and leave it in background,但是那里列出的答案都沒有對我有用。
我嘗試運行一個程式,例如 Slack 或 Discord(或問題更新中列出的其他程式)。即使我的腳本完成,我也希望程式運行。
我需要這個才能在 Windows 上作業。
注意:僅當 Slack / Discord 從 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
更新:
我也測驗過notepad.exe,calc.exe和winver.
notepad.exe并且winver行為與 Slack 和 Discord 相同。但是calc.exe在腳本完成后保持打開狀態(因此該程式表現例外)。
代碼:
subprocess.Popen(['notepad.exe'])
subprocess.Popen(['calc.exe'])
subprocess.Popen(['winver'])
Update 2:
I need to run a few programs this way (including both Slack and Discord), so using os.execl() won't do the job, because it quits python script immediately.
Update 3: As I put in one of comments, it turned out that I was running python from within vscode, and vscode was somehow closing processes after main Python script finished. When I run Python script from Powershell then most answers below work as desired.
uj5u.com熱心網友回復:
您應該使用os.spawn*()函式來創建新行程
這是您的示例:
我們path使用非阻塞標志運行程式os.P_NOWAIT
最后兩個引數被賦予該程序。(是的,如果你不熟悉,第一個引數應該是程式的路徑,它被呼叫,然后是你的引數,更多資訊 google '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")
uj5u.com熱心網友回復:
解決方案實際上比看起來更容易:]
我們可以只使用os.popen在 cmd/pipe 中運行命令,這將使這些行程不依賴于 python 行程!所以讓我們這樣做:
import os
os.popen("notepad.exe")
os.popen("notepad.exe")
print("Bye! Now it's your responsibility to close new process(es) :0")
這是我的靈感,但這個解決方案的作業方式略有不同
僅限 Windows:
此外,如果您不想運行多個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")
uj5u.com熱心網友回復:
由于我既不使用不和諧也不使用松弛,我無法測驗任何東西。但我會嘗試使用行程創建標志來打破新行程和 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)
uj5u.com熱心網友回復:
您應該能夠將程式作為命令而不是子行程運行。您需要使用該os.system(*your command*)功能執行命令。你必須用import os
這樣它應該單獨啟動程式,而不是在子行程中
uj5u.com熱心網友回復:
事實證明,我只需要運行 Python 腳本,而不是從 vscode,而是例如從 Powershell。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/441208.html
標籤:python python-3.x windows subprocess background-process
下一篇:檢查一個單詞是否在lua的陣列中
