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

时间:2017-05-23 10:59:47

标签: python subprocess mingw

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

虽然子进程在Linux上工作正常,但是在windows subprocess.call /Popen上继续抛出错误,说无法找到所需的二进制文件。

例如,我经常使用Xilinx的Vivado(EDA工具)。只需输入" vivado"在mingw提示工作正常,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二进制文件具有执行权限......

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

谢谢!

1 个答案:

答案 0 :(得分: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