gpt4 book ai didi

Python Popen 在复合命令 (PowerShell) 中失败

转载 作者:太空宇宙 更新时间:2023-11-03 14:52:12 25 4
gpt4 key购买 nike

我正在尝试使用 Python 的 Popen 来更改我的工作目录并执行命令。

pg = subprocess.Popen("cd c:/mydirectory ; ./runExecutable.exe --help", stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
buff,buffErr = pg.communicate()

但是,powershell 返回“系统找不到指定的路径。”路径确实存在。

如果我跑

 pg = subprocess.Popen("cd c:/mydirectory ;", stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)

它返回同样的东西。

但是,如果我运行这个:(没有分号)

pg = subprocess.Popen("cd c:/mydirectory",stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)

命令无错误返回。这使我相信分号是问题所在。这种行为的原因是什么?我该如何解决?

我知道我可以只执行 c:/mydirectory/runExecutable.exe --help,但我想知道为什么会这样。

更新:

我测试过将路径传递给 powershell 作为 Popen 的 executable 参数的参数。仅 powershell.exe 可能还不够。要找到 powershell 的真正绝对路径,请执行 where.exe powershell。然后你可以将它传递给 Popen。请注意 shell 仍然是正确的。它将使用默认 shell 但将命令传递给 powershell.exe

powershell = C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
pg = subprocess.Popen("cd c:/mydirectory ; ./runExecutable.exe", stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True, executable=powershell)
buff,buffErr = pg.communicate()
//It works!

最佳答案

在你的subprocess.Popen()打电话,shell=True意味着应该使用平台的默认 shell。

虽然 Windows 世界正在从 CMD (cmd.exe) 转移到 PowerShell,但 Python 会根据 COMSPEC 确定要调用的 shell。环境变量仍然指向cmd.exe ,即使在最新的 W10 更新中,就 GUI 提供的默认 shell 而言,它已转向 PowerShell。

为了向后兼容,这不会很快改变,而且可能永远不会改变。

因此,您的选择是:

  • 使用 cmd语法,如 Maurice Meyer's 中所建议回答。

  • 使用shell = True并调用 powershell.exe 明确地 - 见下文。

  • 仅限 Windows:重新定义环境变量 COMSPEC使用前 shell = True - 见下文。


如何调用 powershell 的简单 Python 示例直接二进制,命令行开关后跟一个包含要执行的 PowerShell 源代码的字符串:

import subprocess

args = 'powershell', '-noprofile', '-command', 'set-location /; $pwd'
subprocess.Popen(args)

请注意,我故意使用了 powershell而不是 powershell.exe ,因为这开启了命令在 Unix 平台上工作的可能性,一旦 PowerShell Core已发布。


仅限 Windows:shell = True 的示例, 重新定义环境变量后 COMSPEC首先指向 PowerShell:

import os, subprocess    

os.environ["COMSPEC"] = 'powershell'

subprocess.Popen('Set-Location /; $pwd', shell=True)

注意:

  • COMSPEC仅在 Windows 上查询;在 Unix 平台上,shell 可执行文件总是 /bin/sh

  • 从 Windows PowerShell v5.1/PowerShell Core v6-beta.3 开始,调用 powershell只有 -c (解释为 -Command )仍然默认加载配置文件,这可能会产生意想不到的副作用(通过上面使用的 powershell 的显式调用,-noprofile 抑制了它)。

    • 将默认行为更改为加载配置文件是此 GitHub issue 的主题,努力使 PowerShell 的 CLI 与类似 POSIX 的 shell 保持一致。

关于Python Popen 在复合命令 (PowerShell) 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45090604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com