如何使用子进程运行此命令?
我试过了:
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
我注意到的事情:
答案 0 :(得分:11)
首先,你实际上并不需要管道;你只是发送输入。您可以使用subprocess.communicate。
其次,不要将命令指定为字符串;一旦涉及带空格的文件名,那就太乱了。
第三,如果你真的想要执行一个管道命令,只需调用shell即可。在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')
答案 1 :(得分:4)
你说得对,ECHO就是问题所在。如果没有shell = True选项,则无法找到ECHO命令。
这会因您看到错误而失败:
subprocess.call(["ECHO", "Ni"])
通过:打印Ni和0
subprocess.call(["ECHO", "Ni"], shell=True)