Запустите процесс и не ждите - PullRequest
33 голосов
/ 18 августа 2010

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

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

Ответы [ 4 ]

46 голосов
/ 18 августа 2010

Этот вызов не ожидает завершения дочернего процесса (в Linux). Не спрашивайте меня, что делает close_fds; Я написал код несколько лет назад. (Кстати: документация subprocess.Popen сбивает с толку, ИМХО.)

proc = Popen([cmd_str], shell=True,
             stdin=None, stdout=None, stderr=None, close_fds=True)

Edit:

Я посмотрел на документацию подпроцесса , и я считаю, что важным для вас аспектом является stdin=None, stdout=None, stderr=None,. В противном случае Popen фиксирует выходные данные программы, и вы должны посмотреть на них. close_fds делает дескрипторы файлов родительского процесса недоступными для ребенка.

19 голосов
/ 15 июля 2011

Я наконец получил это на работу.Я использую «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)

Это отключает все каналы стандартного ввода / вывода и НЕ выполняет вызываемую программу в оболочке.Установка 'creationflags' в DETACHED_PROCESS, казалось, сделала мне трюк.Я забыл, где я узнал об этом, но здесь используется пример .

2 голосов
/ 11 апреля 2017

Я думаю, что самый простой способ реализовать это - использовать семейство функций os.spawn * с флагом P_NOWAIT.

Это, например, вызовет процесс cp для копирования большого файла в новый каталог и не будет ждать его.

import os
os.spawnlp(os.P_NOWAIT, 'cp', 'cp', '/path/large-file.db', '/path/dest')
0 голосов
/ 22 января 2018

Вы фиксируете ввод и вывод в программу, поэтому ваша программа не прекратит работу, пока эти дескрипторы файлов остаются открытыми.Если вы хотите захватить, вам нужно закрыть дескрипторы файлов.Если вы не хотите захватывать:

app = "C:\Windows\Notepad.exe"
file = "C:\Path\To\File.txt"

pid = subprocess.Popen([app, file]).pid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...