Python - 子进程 - 如何在 Windows 中调用管道命令?

发布于 2024-07-25 16:42:48 字数 854 浏览 6 评论 0原文

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

我尝试过:

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. 如果我删除 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:

  1. Running the command on the windows
    console works fine.
  2. 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我不在是我 2024-08-01 16:42:48

首先也是最重要的是,您实际上并不需要管道;而是需要管道。 您只是发送输入。 您可以使用 subprocess.communicate 来实现这一点。

其次,不要将命令指定为字符串; 一旦涉及带空格的文件名,那就很混乱了。

第三,如果您确实想执行管道命令,只需调用 shell 即可。 在 Windows 上,我相信它是 cmd /c 程序名称参数 | 更多内容。

最后,单反斜杠可能很危险:"\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')

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.

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')
∞琼窗梦回ˉ 2024-08-01 16:42:48

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

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

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

此通过:打印 Ni 和 0

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

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:

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

This passes: prints Ni and a 0

subprocess.call(["ECHO", "Ni"], shell=True)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文