Запустить процесс и не ждать
Я хотел бы запустить процесс и не ждать его возврата. Я пробовал икру с P_NOWAIT и подпроцессом следующим образом:
app = "C:\Windows\Notepad.exe"
file = "C:\Path\To\File.txt"
pid = subprocess.Popen([app, file], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE).pid
Однако консольное окно остается до тех пор, пока я не закрою блокнот. Возможно ли запустить этот процесс и не дождаться его завершения?
Ответы
Ответ 1
Этот вызов не ждет завершения дочернего процесса (в Linux). Не спрашивайте меня, что делает close_fds
; Я написал код несколько лет назад. (BTW: Документация subprocess.Popen
запутанная, ИМХО.)
proc = Popen([cmd_str], shell=True,
stdin=None, stdout=None, stderr=None, close_fds=True)
Edit:
Я просмотрел документацию subprocess, и я считаю, что важным аспектом для вас является stdin=None, stdout=None, stderr=None,
. В противном случае Popen захватывает вывод программы, и вы должны смотреть на него. close_fds
делает дескрипторы файла родительского процесса недоступными для дочернего элемента.
Ответ 2
Наконец-то я получил это, чтобы работать. Я запускаю "Python 2.6.6 (r266: 84297, 24 августа 2010, 18:13:38) [MSC v.1500 64 бит (AMD64)] win32". Вот как мне пришлось его кодировать:
from subprocess import Popen
DETACHED_PROCESS = 0x00000008
cmd = [
sys.executable,
'c:\somepath\someprogram.exe',
parm1,
parm2,
parm3
]
p = Popen(cmd,shell=False,stdin=None,stdout=None,stderr=None,close_fds=True,creationflags=DETACHED_PROCESS)
Это отключает все каналы стандартного ввода/вывода и НЕ выполняет вызываемую программу в оболочке. Установка "создания флагов" в DETACHED_PROCESS, похоже, сделала трюк для меня. Я забыл, где я узнал об этом, но пример используется здесь.
Ответ 3
Я думаю, что простой способ реализовать это с помощью os.spawn * семейства функций, передающих флаг P_NOWAIT
.
Это, например, вызовет процесс cp
, чтобы скопировать большой файл в новый каталог и не утруждать его ожиданием.
import os
os.spawnlp(os.P_NOWAIT, 'cp', 'cp', '/path/large-file.db', '/path/dest')