【问题标题】:Python subprocess running from mingw fails to find binaries从 mingw 运行的 Python 子进程无法找到二进制文件
【发布时间】:2017-05-23 10:59:47
【问题描述】:

我有一组 python 模块,我想在 linux 和 MinGW (Windows) 上工作。

虽然 subprocess 在 Linux 上运行良好,但在 windows subprocess.call/Popen 上不断抛出错误,提示找不到所需的二进制文件。

例如,我经常使用 Xilinx 的 Vivado(EDA 工具)。虽然只是在 mingw 提示符中输入“vivado”可以正常工作并启动 vivado,但如果我尝试通过子进程调用 vivado,我会收到一条错误消息,提示找不到文件。

我的 mingw 环境路径变量包含:/c/Xilinx/Vivado/2015.2/bin,这是找到 vivado 二进制文件的位置。如果我启动 python 并执行此操作,

print os.environ['PATH']

我看到它包含:C:\\Xilinx\\Vivado\\2015.2\\bin;

所以我猜 python 在启动时执行了适当的翻译。

此外,如果我尝试从 python 的子进程启动 vivado.bat(与二进制文件位于同一目录中的文件)而不是 vivado,则一切正常,并且二进制文件已启动。

vivado 二进制文件有执行权限...

所以我的问题是。这个问题是已知的吗?最干净的解决方法是什么?

谢谢!

【问题讨论】:

  • 能否请您分享问题的上下文(python 版本、路径等),特别是启动该过程的代码部分。
  • 首先改变路径的不是python,而是MinGW。其次,你能发布你的代码和你得到的确切输出吗? (也有 PATH 打印)。如果您有 2 个“vivado”文件(一个 .bat 和一个 .exe,您可能需要指定扩展名,因为这可能是个问题。另一个“vivado”文件的扩展名是什么?帮助我们帮助您:)
  • 感谢您的回复,但我已经解决了这个问题。我对 subprocess.Popen 进行了一些动态修改以检测当前平台并根据 Windows 版本调用 Windows Powershell 或 cmd,但我意识到这种方法都是错误的。我这样做是因为我不认为这个问题与我特别调用的工具有关,所以我不想更改平台函数调用的二进制文件,我现在意识到这更干净,可能更好。我现在在 Windows 中调用 .bat,否则调用二进制文件。

标签: python subprocess mingw


【解决方案1】:

不确定这是否准确回答了 OP,但我认为它高度相关:考虑这个示例,其中可执行路径以 Windows 样式编写,带有反斜杠:

#!/usr/bin/env python3

import sys, os
import subprocess

NOTEPADPATH = r"C:\WINDOWS\system32\notepad.exe"

print("NOTEPADPATH is {}".format(NOTEPADPATH))

proc_notepad = subprocess.Popen([NOTEPADPATH], shell=False)

如果我在 MSYS2 shell 中运行它,它会失败:

$ python3 test.py
NOTEPADPATH is C:\WINDOWS\system32\notepad.exe
Traceback (most recent call last):
  File "test4.py", line 11, in <module>
    proc_notepad = subprocess.Popen([NOTEPADPATH], shell=False)
  File "/usr/lib/python3.7/subprocess.py", line 775, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.7/subprocess.py", line 1522, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\WINDOWS\\system32\\notepad.exe': 'C:\\WINDOWS\\system32\\notepad.exe'

如果我在 Anaconda 3 shell Python3 中运行它(显然是为 Windows 编译的),它会成功(记事本已启动):

(base) C:\msys64\tmp>python test.py
NOTEPADPATH is C:\WINDOWS\system32\notepad.exe

如果我们现在更改可执行路径,那么它使用正斜杠作为路径分隔符,而不是反斜杠:

#!/usr/bin/env python3

import sys, os
import subprocess

NOTEPADPATH = r"C:/WINDOWS/system32/notepad.exe"

print("NOTEPADPATH is {}".format(NOTEPADPATH))

proc_notepad = subprocess.Popen([NOTEPADPATH], shell=False)

...然后在启动记事本的 MSYS2 中都成功:

$ python3 test.py
NOTEPADPATH is C:/WINDOWS/system32/notepad.exe

...在 Anaconda 3 shell Python3 中:

(base) C:\msys64\tmp>python test.py
NOTEPADPATH is C:/WINDOWS/system32/notepad.exe

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多