2012-07-23 9 views
15

Nie rozumiem, dlaczego tak trudno jest zrobić to w systemie Windows.Python: Uruchom nowy wiersz polecenia w systemie Windows i poczekaj na jego zakończenie/zamknięcie.

Chcę odrodzić się kilka okien wiersza polecenia, które będą uruchamiać inne skrypty. Powodem, dla którego chcę to zrobić, jest to, że widzę wszystkie dane wyjściowe z każdego skryptu starannie (jeśli mam je tylko wątki/podprocesy w głównym oknie, nie widzę poprawnie wszystkich danych wyjściowych). Nie chcę też rejestrować danych wyjściowych, ponieważ jest to głównie przeglądanie pasków postępu, które tak naprawdę nie działają z plikami dziennika.

więc poszczególne części moich wymagań pracy, ale nie razem:

os.system("start cmd /c {command here}")  # Launches in new command prompt, closes when done 

Jednak system operacyjny nie pozwala mi czekać, aż zakończy dowodzenia (od startu jest rzeczywista komenda, drugi otwiera nowy wiersz polecenia jest „gotowe”)

Podobnie jeśli próbuję:

p = subprocess.Popen(["start", "cmd", "/k", "{command here}], shell = True) # Needs to be shell since start isn't an executable, its a shell cmd 
p.wait() # I can wait until finished (although it too finishes after start finishes) 

Więc jak mam to zrobić? Czytałem gdzieś, że rozwiązaniem może być użycie grupy procesowej, ale to jest tylko unix .... lub coś w tym stylu, albo jeśli masz zgrabny sposób wyświetlania danych wyjściowych ze wszystkich podprocesów w jednym oknie, to ja Trzeba otworzyć nowy wiersz polecenia i po prostu użyć wątków. To też działa, ale jeśli mogę powiedzieć, że 4 wątki pobierają coś i wyświetlają pasek postępu, a także wyprowadzają inne informacje, nie wiem, jak wyświetlić to w sposób, który można odczytać (a także uniknąć ich wszystkich kolidujących z wzajemnie).

PS: Ta jest w systemie Windows Vista. PPS: Wolę rozwiązanie, które działa na Windowsie, Linuksie i Macu. Na razie skupiam się na Windowsie, ale chciałbym, aby rozwiązanie pasowało do wszystkich trzech i wiem, że Windows jest najbardziej wybredny. Chciałbym tylko zastąpić "początek cmd/c" dla odpowiedniego polecenia systemu operacyjnego.

+0

Czy istnieje powód używasz „start” vs dzięki „cmd” jako polecenia? – Joe

+0

Tylko sposób, w jaki znalazłem otworzyć nowe okno wiersza polecenia, jeśli jest inny sposób, który jest dobry – robev

Odpowiedz

1

Jak o

os.system("cmd /c {command here}") 

Albo nawet

os.system("{command here}") 

Jest początek dowodzić ten, który wprowadza odrębną sesję zamiast przy użyciu tego samego jeden program python jest uruchomiony.

+0

To nie uruchamia nowego okna wiersza polecenia, uruchamia go w bieżącym oknie – robev

4

Możesz przekazać/CZEKAJ komendę start, aby czekać na zakończenie.

2

Aby otworzyć w nowym oknie wiersza polecenia Używam:

os.system("start /B start cmd.exe @cmd /k mycommand...") 
Powiązane problemy