我怎么运行这个命令和子进程的?

我试过:

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. 如果我删除了 回bosco|部分,它的正常运行的 该popen呼吁以上。所以我觉得 这个问题是关系到回音或 |.
有帮助吗?

解决方案

首先,你实际上并不需要一个管道;你只是发送的输入。你可以使用 子流程.沟通 为。

其次,不指定的命令作为串;这就是混乱的,尽快作为文件与空间都参与其中。

第三,如果你真想要执行一个管道命令,就打电话的外壳。在Windows,我相信这是 cmd /c program name arguments | further stuff.

最后,单一的背斜线可以是危险的: "\p"'\\p', 但 '\n' 是一个新的线.使用 操作系统。路径。join()操作系统。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')

其他提示

你是对的,的回声问题。没有外壳=真正的选择ECHO命令不能被发现。

这种失败的错误你看到的:

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

这种通行证:印Ni和0

subprocess.call(["ECHO", "Ni"], shell=True)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top