Как я могу вывести информацию об обработке цикла Python в командную строку? - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь настроить (железный) скрипт на python, который отображает некоторую информацию об обработке в командной строке. Что-то вроде:

list = ["a", "b", "c"]
for i in list:
    cmd /k echo str(list.index(i)) #just echo index and leave window open so user can see progression

Задача состоит в том, чтобы отправить несколько команд эха одному и тому же экземпляру командной строки.

Примечание: я не могу просто использовать print(i) в этом случае, потому что этот сценарий ironpython будет работать внутри приложения визуального программирования, которое не позволяет печатать в командной строке. Цель сценария - пользователи могут видеть прогресс во время тяжелых операций.

Я сталкивался с несколькими потоками, которые предлагают подпроцесс для этого. Я видел и проверял множество примеров, но ни один из них не сработал. Я мог бы действительно помочь с этим.

Например, когда я делаю это ...

import subprocess
proc=subprocess.Popen("echo hello world", shell=True, stdout=subprocess.PIPE)

.... тогда я вижу, что возвращается "привет мир", поэтому эхо, вероятно, было успешным. Но я никогда не вижу всплывающее окно оболочки.

Редактировать 1

Еще несколько результатов теста: метод 1 дает хороший результат (команда выполнена, и экран оставлен открытым для чтения);метод 2: добавление стандартного вывода открывает оболочку и оставляет экран открытым, но без видимого результата - нечего читать;Способ 3: добавление стандартного ввода мигает экран (закрывает его слишком рано)

метод 1:

process = Popen("cmd /k dir")

метод 2:

process = Popen("cmd /k dir",stdout=subprocess.PIPE)

метод 3:

process = Popen('cmd /k dir',stdin=subprocess.PIPE)

Редактировать 2

Метод 4 - создает два отдельных окна cmd, одно показывает a, другое - b. Не это.

process = Popen("cmd /k echo a")
process = Popen("cmd /k echo b")

Метод 5 - добавление process.stdin.write после stdin - просто мигает

process = Popen('cmd /k echo a',stdin=subprocess.PIPE)
process.stdin.write("cmd /k echo b")

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

1 Ответ

0 голосов
/ 01 октября 2019

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

Например, вы можетеНапишите сценарий сервера для запуска в окне CMD, а затем отправьте ему сообщения из сценария IronPython. Но тогда вам нужно беспокоиться о том, как запустить сервер, как его остановить и как синхронизировать с клиентским скриптом IronPython. Вы можете увидеть пример такого рода межпроцессного взаимодействия в этом ответе StackOverflow .

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

...