【问题标题】:Python - Subprocess - How to call a Piped command in Windows?Python - 子进程 - 如何在 Windows 中调用管道命令?
【发布时间】:2010-11-05 23:57:05
【问题描述】:

如何使用子进程运行此命令?

我试过了:

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. 在 Windows 上运行命令 控制台工作正常。
  2. 如果我删除 回声博斯科|部分,它运行良好 上面的公开电话。所以我认为 这个问题与回声或 |。

【问题讨论】:

  • 当您在 Windows 控制台中运行该完整行时,它是否真的有效? WindowsError 表明问题不是你的 Python 代码,而是要执行的实际命令。
  • 是的,它从 Windows DOS 控制台运行。

标签: python subprocess pipe echo popen


【解决方案1】:

首先,您实际上并不需要管道;你只是在发送输入。你可以使用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')

【讨论】:

    【解决方案2】:

    你是对的,ECHO 是问题所在。如果没有 shell=True 选项,则无法找到 ECHO 命令。

    这会失败并出现您看到的错误:

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

    通过:打印 Ni 和 0

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

    【讨论】:

    • 其实这不应该是subprocess.call("ECHO Ni", shell=True) 吗? subprocess.call(["ECHO", "Ni"]) 对我来说很好。
    • 您可以使用其中任何一种,但根据 Popen Constructor 文档:“除非另有说明,否则建议将 args 作为序列传递。”
    猜你喜欢
    • 2016-01-27
    • 2011-11-11
    • 2020-12-07
    • 2021-04-11
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多