2017-02-22 16 views
0

Я пытаюсь запустить простой скрипт в окнах в той же оболочке. Когда я бегуsubprocess.Popen не работает с shell = False

subprocess.call(["python.exe", "a.py"], shell=False) 

Он отлично работает.

Но когда я бегу

subprocess.Popen(["python.exe", "a.py"], shell=False) 

Он открывает новую оболочку и скорлупу = ложь не влияет.

a.py просто напечатайте сообщение на экране.

+0

Возможный дубликат [Python: подпроцесс вызов с оболочкой = False не работает] (http://stackoverflow.com/questions/25465700/python-subprocess-call- with-shell-false-not-working) –

ответ

0

Первый вызов Popen с shell=False не означает, что базовый python не будет пытаться открыть окно/консоль. Просто текущий экземпляр python выполняет непосредственно python.exe, а не в системной оболочке (cmd или sh).

Во-вторых, Popen возвращает дескриптор процесса, и вы должны выполнить wait() на этом дескрипторе, чтобы он мог нормально завершаться или вы могли генерировать несуществующий процесс (в зависимости от платформы, на которой вы работаете). Я предлагаю вам попробовать

p = subprocess.Popen(["python.exe", "a.py"], shell=False) 
return_code = p.wait() 

Ожидать завершения процесса и получить код возврата.

Обратите внимание, что Popen - очень плохой способ запуска процессов в фоновом режиме. Лучше всего было бы использовать отдельный поток

import subprocess 
import threading 

def run_it(): 
    subprocess.call(["python.exe", "a.py"], shell=False) 

t = threading.Thread(target=run_it) 
t.start() 
# do your stuff 

# in the end 
t.join() 
+0

Но я не хочу ждать завершения процесса. Именно по этой причине я использую Popen и не звоню. – Hila

+0

ОК, затем посмотрите мое редактирование. Не используйте «Popen» вообще. –

+0

Спасибо, проблема в том, что он все еще ждет, пока закончится нить ... Я хочу, чтобы мой код запустился, выполнил другой процесс и завершил работу. Я не хочу ждать завершения процесса. – Hila