Подтвердить что ты не робот

Запустить процесс и не ждать

Я хотел бы запустить процесс и не ждать его возврата. Я пробовал икру с 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

Однако консольное окно остается до тех пор, пока я не закрою блокнот. Возможно ли запустить этот процесс и не дождаться его завершения?

4b9b3361

Ответ 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')