从mingw运行的Python子进程无法找到二进制文件

问题描述 投票:1回答:1

我有一组想同时在linux和MinGW(Windows)上运行的python模块。

虽然子进程在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 subprocess mingw
1个回答
0
投票

[不确定这是否可以正确地回答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
© www.soinside.com 2019 - 2024. All rights reserved.