Python – Подпроцесс – Как вызвать команду Piped в Windows?
-
20-08-2019 - |
Вопрос
Как запустить эту команду с подпроцессом?
Я пытался:
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
Вещи, которые я заметил:
- Запуск команды на консоли Windows работает нормально.
- Если я удалю эхо 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)