Python: запустите новую командную строку в Windows и дождитесь ее завершения/выхода

Я не понимаю, почему так сложно сделать это в Windows.

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

Поэтому отдельные части моих требований работают, но не вместе:

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

Однако система os не позволит мне дождаться завершения команды (так как start - это действительная команда, вторая - новая команда) "

Аналогично, если я пытаюсь:

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)

Итак, как мне это сделать? Я где-то читал, что решение может состоять в том, чтобы использовать processgroup, но это unix только.... или что-то вроде этого

Или если у вас есть аккуратный способ отображения вывода из всех подпроцессов в одном окне, тогда мне не нужно открывать новую командную строку и просто использовать потоки. Это тоже работает, но если я скажу, что 4 потока загружают что-то и отображают индикатор выполнения, а также вывод другой информации, я не знаю, как отображать это так, как можно читать (а также избегать их всех, сталкиваясь с друг друга).

PS: Это в Windows Vista. PPS: Я бы предпочел, чтобы решение, которое работает в Windows, Linux и Mac, сейчас я сосредоточен на Windows, но мне бы хотелось, чтобы решение работало для всех трех, и я знаю, что Windows является наиболее утонченной. Я бы просто заменил "начало cmd/c" для соответствующей команды OS.

Ответ 1

Прочитав ваш комментарий к моему предыдущему ответу, вам нужно:

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

Держите ссылку на команду Windows всегда под рукой!

Ответ 2

Принятый ответ не работал для меня. Чтобы открыть в новой командной строке, я использовал:

os.system("start /B start cmd.exe @cmd /k mycommand...")

Ответ 3

Вы можете передать /WAIT в команду start, чтобы дождаться завершения.

Ответ 4

Как насчет

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

Или даже

os.system("{command here}")

Это команда запуска, запускающая отдельный сеанс вместо того, чтобы использовать ту же программу, на которой запущена программа python.