2011-06-24 10 views
24

Mam pomyślnie uruchomić kilka skryptów Pythona nazywając je ze skryptu bazowej za pomocą modułu subprocess:Jak mogę odradzać nowe powłoki do uruchamiania skryptów Pythona z podstawowego skryptu python?

subprocess.popen([sys.executable, 'script.py'], shell=True) 

Jednak każdy z tych skryptów wykonuje pewne symulacje (pliki .exe z C++ aplikacji), które wytwarzają pewne wyjście do muszla. Wszystkie te wyniki są zapisywane do powłoki podstawowej, skąd uruchomiłem te skrypty. Chciałbym wygenerować nową powłokę dla każdego skryptu. Próbowałem generować nowe powłoki za pomocą atrybutu shell = True podczas wywoływania subprocess.call (również próbowałem z popen), ale to nie działa.

Jakieś pojęcie o tym, jak uzyskać nową powłokę dla każdego procesu wygenerowanego za pomocą podprocesu.

Dzięki.

Edycja: Czytałem dokument o stdin i stdout zgodnie z sugestią Spencer, i znalazłem flagę, która rozwiązała problem: podproces.CREATE_NEW_CONSOLE. Może przekierowanie rur również działa, ale wydaje się to być najprostszym rozwiązaniem (przynajmniej dla tego konkretnego problemu). Właśnie przetestowałem i działałem idealnie:

subprocess.popen([sys.executable, 'script.py'], creationflags = subprocess.CREATE_NEW_CONSOLE) 

Dziękuję wszystkim!

+0

Czy to znaczy, że chce do uruchamiania skryptów w różnych oknach terminali? Jeśli tak, to jakiego programu terminalowego używasz? – unutbu

+0

@unutbu: tak, chcę uruchomić każdy skrypt w innym oknie terminala. Używam podstawowego terminala Windowsa (po prostu działającego cmd) – emiguel

+0

@Eder: Nie wiem zbyt wiele o systemie Windows. Czy to pomaga: http://stackoverflow.com/questions/303838/create-a-new-cmd-exe-window-from-within-another-cmd-exe-prompt? (np. 'start cmd.exe' lub' start python script.py' ...) – unutbu

Odpowiedz

9

Popen generuje już proces dodatkowy do obsługi rzeczy. Wystarczy przekierować przewody wyjściowe. Spójrz na dokumenty subprocess, w szczególności na temat przekierowania popen stdin, stdout i stderr.

Jeśli nie przekierujesz tych rur, odziedziczy je po rodzicu. Tylko uważaj na zakleszczenia swoich procesów.

EDIT:

nie zdawałem sobie sprawy chciałeś dodatkowych okien dla każdego podprocesu. To też jest obsługiwane. Spójrz na sekcję podprocesu startupinfo. Wyjaśnia, jakie opcje ustawić w oknach, aby utworzyć nowy terminal dla każdego podprocesu. Zauważ, że wymaga użycia opcji shell = True.

EDIT 2:

Huh, jakoś brakowało mi sekcję utworzyć nową konsolę. Dziękuję za wskazanie tego.

2

To nie odpowiada na twoje pytanie. Ale miałem też problemy z podprocesami, a pexpect okazał się bardzo pomocny.

+0

Wątpię, aby 'pexpect' byłby bardzo pomocny, ponieważ wymaga modułu' pth', ponieważ nie jest obsługiwany w systemie Windows (co uważam, że OP używa, ponieważ wspomniał o uruchomieniu plików ".exe"). – martineau

+0

@martineau: Dzięki za informację, nie zdawałem sobie z tego sprawy. –

33

Aby otworzyć w innej konsoli, czy (testowane na Win7/Python 3):

from sys import executable 
from subprocess import Popen, CREATE_NEW_CONSOLE 

Popen([executable, 'script.py'], creationflags=CREATE_NEW_CONSOLE) 

input('Enter to exit from this launcher script...') 
+0

działa świetnie, z wyjątkiem użycia raw_input zamiast wejścia – cowlinator

+8

Python 3 używa wejścia zamiast raw_input. – Shule

+3

aaaaaahhhhhhhhh !!!! Zajęło mi to 30 minut, aby znaleźć tę konkretną odpowiedź. Dzięki i otrzymasz za to kolejne 10K w górę. – velis

Powiązane problemy