Python - 子进程 - 如何在 Windows 中调用管道命令?
如何使用子进程运行此命令?
我尝试过:
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 上运行命令 控制台工作正常。
- 如果我删除 ECHO 黄宗泽| 部分,它运行良好 上面的 popen 调用。 所以我认为 这个问题与 echo 或 |。
How do I run this command with subprocess?
I tried:
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()
but got:
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
Things I've noticed:
- Running the command on the windows
console works fine. - If I remove the
ECHO bosco| part, it runs fine the
the popen call above. So I think
this problem is related to echo or
|.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
首先也是最重要的是,您实际上并不需要管道;而是需要管道。 您只是发送输入。 您可以使用 subprocess.communicate 来实现这一点。
其次,不要将命令指定为字符串; 一旦涉及带空格的文件名,那就很混乱了。
第三,如果您确实想执行管道命令,只需调用 shell 即可。 在 Windows 上,我相信它是 cmd /c 程序名称参数 | 更多内容。
最后,单反斜杠可能很危险:
"\p"
是'\\p'
,但'\n'
是一个新行。 使用 os.path.join() 或 os.sep 或者,如果在 python 外部指定,则只是一个正斜杠。First and foremost, you don't actually need a pipe; you are just sending input. You can use subprocess.communicate for that.
Secondly, don't specify the command as a string; that's messy as soon as filenames with spaces are involved.
Thirdly, if you really wanted to execute a piped command, just call the shell. On Windows, I believe it's
cmd /c program name arguments | further stuff
.Finally, single back slashes can be dangerous:
"\p"
is'\\p'
, but'\n'
is a new line. Use os.path.join() or os.sep or, if specified outside python, just a forward slash.你是对的,ECHO 就是问题所在。 如果没有 shell=True 选项,则无法找到 ECHO 命令。
失败并出现您看到的错误:
此通过:打印 Ni 和 0
You were right, the ECHO is the problem. Without the shell=True option the ECHO command cannot be found.
This fails with the error you saw:
This passes: prints Ni and a 0