Python – Подпроцесс – Как вызвать команду Piped в Windows?

StackOverflow https://stackoverflow.com/questions/1046474

Вопрос

Как запустить эту команду с подпроцессом?

Я пытался:

proc = subprocess.Popen(
    '''ECHO bosco|"C:\Program Files\GNU\GnuPG\gpg.exe" --batch --passphrase-fd 0 --output "c:\docume~1\usi\locals~1\temp\tmptlbxka.txt" --decrypt "test.txt.gpg"''',
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
   stderr=subprocess.STDOUT,
)
stdout_value, stderr_value = proc.communicate()

но получил:

Traceback (most recent call last):
...
  File "C:\Python24\lib\subprocess.py", line 542, in __init__
    errread, errwrite)
  File "C:\Python24\lib\subprocess.py", line 706, in _execute_child
    startupinfo)
WindowsError: [Errno 2] The system cannot find the file specified

Вещи, которые я заметил:

  1. Запуск команды на консоли Windows работает нормально.
  2. Если я удалю эхо Bosco | Частично, он отлично запускает вызов Popen выше.Поэтому я думаю, что эта проблема связана с Echo или |.
Это было полезно?

Решение

Прежде всего, вам на самом деле не нужна труба;вы просто отправляете ввод.Вы можете использовать подпроцесс.коммуникация для этого.

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

В-третьих, если вы действительно хотите выполнить команду по конвейеру, просто вызовите оболочку.Я считаю, что в Windows это cmd /c program name arguments | further stuff.

Наконец, одиночные обратные косые черты могут быть опасными: "\p" является '\\p', но '\n' это новая линия.Использовать os.path.join() или ос.сен или, если указано вне Python, просто косая черта.

proc = subprocess.Popen(
    ['C:/Program Files/GNU/GnuPG/gpg.exe',
    '--batch', '--passphrase-fd', '0',
    '--output ', 'c:/docume~1/usi/locals~1/temp/tmptlbxka.txt',
    '--decrypt', 'test.txt.gpg',],
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
   stderr=subprocess.STDOUT,
)
stdout_value, stderr_value = proc.communicate('bosco')

Другие советы

Вы были правы, проблема в ЭХО.Без опции оболочки=True команду ECHO невозможно найти.

Это не удается из-за ошибки, которую вы видели:

subprocess.call(["ECHO", "Ni"])

Это проходит:печатает Ni и 0

subprocess.call(["ECHO", "Ni"], shell=True)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top