Python - Подпроцесс - Как вызвать команду Piped в Windows? - PullRequest
5 голосов
/ 26 июня 2009

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

Я пытался:

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. Запуск команды на окнах Консоль работает нормально.
  2. Если я уберу ЭХО Боско | часть, она работает нормально попен звонок выше. Я так думаю эта проблема связана с эхом или |.

Ответы [ 2 ]

11 голосов
/ 26 июня 2009

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

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

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

Наконец, одиночные косые черты могут быть опасны: "\p" - это '\\p', но '\n' - это новая строка. Используйте os.path.join () или os.sep или, если указано вне 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')
4 голосов
/ 10 мая 2011

Вы были правы, проблема в ECHO. Без параметра shell = True команда ECHO не может быть найдена.

Это не с ошибкой, которую вы видели:

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

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

subprocess.call(["ECHO", "Ni"], shell=True)
...