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

从mingw运行的Python子进程找不到二进制文件,python,subprocess,mingw,Python,Subprocess,Mingw,我有一组python模块,我想在linux和MinGW(Windows)上使用它们 虽然subprocess在Linux上可以正常工作,但在windows subprocess.call/Popen上不断抛出错误,表示找不到所需的二进制文件 例如,我经常使用Xilinx的Vivado(EDA工具)。虽然只需在mingw提示符中键入“vivado”即可正常工作并启动vivado,但如果我尝试通过子进程调用vivado,则会出现一个错误,说明找不到该文件 My mingw环境路径变量包含:/c/Xi

我有一组python模块,我想在linux和MinGW(Windows)上使用它们

虽然subprocess在Linux上可以正常工作,但在windows subprocess.call/Popen上不断抛出错误,表示找不到所需的二进制文件

例如,我经常使用Xilinx的Vivado(EDA工具)。虽然只需在mingw提示符中键入“vivado”即可正常工作并启动vivado,但如果我尝试通过子进程调用vivado,则会出现一个错误,说明找不到该文件

My 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二进制文件具有执行权限

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


谢谢

< P >不确定这是否正确地回答了OP,但我认为它是高度相关的:考虑这个示例,其中可执行路径是Windows风格的,带有反斜杠:

#/usr/bin/env蟒蛇3
导入系统,操作系统
导入子流程
NOTEPADPATH=r“C:\WINDOWS\system32\notepad.exe”
打印(“NOTEPADPATH为{}”。格式(NOTEPADPATH))
proc_notepad=subprocess.Popen([NOTEPADPATH],shell=False)
如果我在MSYS2 shell中运行此程序,它将失败:

$python3 test.py
记事本路径为C:\WINDOWS\system32\notepad.exe
回溯(最近一次呼叫最后一次):
文件“test4.py”,第11行,在
proc_notepad=subprocess.Popen([NOTEPADPATH],shell=False)
文件“/usr/lib/python3.7/subprocess.py”,第775行,在__
恢复信号,启动新会话)
文件“/usr/lib/python3.7/subprocess.py”,第1522行,在执行子进程中
引发子项异常类型(错误号、错误消息、错误文件名)
FileNotFoundError:[Errno 2]没有这样的文件或目录:“C:\\WINDOWS\\system32\\notepad.exe”:“C:\\WINDOWS\\system32\\notepad.exe”
如果我在Anaconda3ShellPython3(显然是为Windows本机编译的)中运行此程序,则会成功(记事本已启动):

(基本)C:\msys64\tmp>python test.py
记事本路径为C:\WINDOWS\system32\notepad.exe

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

#/usr/bin/env蟒蛇3
导入系统,操作系统
导入子流程
NOTEPADPATH=r“C:/WINDOWS/system32/notepad.exe”
打印(“NOTEPADPATH为{}”。格式(NOTEPADPATH))
proc_notepad=subprocess.Popen([NOTEPADPATH],shell=False)
。。。然后,它在MSYS2(记事本的启动位置)中都成功:

$python3 test.py
记事本路径为C:/WINDOWS/system32/notepad.exe
。。。在水蟒3壳蟒蛇3中:

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

不确定这是否正确地回答了OP,但我认为它是高度相关的:考虑这个示例,其中可执行路径是Windows风格的,带有反斜杠:

#/usr/bin/env蟒蛇3
导入系统,操作系统
导入子流程
NOTEPADPATH=r“C:\WINDOWS\system32\notepad.exe”
打印(“NOTEPADPATH为{}”。格式(NOTEPADPATH))
proc_notepad=subprocess.Popen([NOTEPADPATH],shell=False)
如果我在MSYS2 shell中运行此程序,它将失败:

$python3 test.py
记事本路径为C:\WINDOWS\system32\notepad.exe
回溯(最近一次呼叫最后一次):
文件“test4.py”,第11行,在
proc_notepad=subprocess.Popen([NOTEPADPATH],shell=False)
文件“/usr/lib/python3.7/subprocess.py”,第775行,在__
恢复信号,启动新会话)
文件“/usr/lib/python3.7/subprocess.py”,第1522行,在执行子进程中
引发子项异常类型(错误号、错误消息、错误文件名)
FileNotFoundError:[Errno 2]没有这样的文件或目录:“C:\\WINDOWS\\system32\\notepad.exe”:“C:\\WINDOWS\\system32\\notepad.exe”
如果我在Anaconda3ShellPython3(显然是为Windows本机编译的)中运行此程序,则会成功(记事本已启动):

(基本)C:\msys64\tmp>python test.py
记事本路径为C:\WINDOWS\system32\notepad.exe

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

#/usr/bin/env蟒蛇3
导入系统,操作系统
导入子流程
NOTEPADPATH=r“C:/WINDOWS/system32/notepad.exe”
打印(“NOTEPADPATH为{}”。格式(NOTEPADPATH))
proc_notepad=subprocess.Popen([NOTEPADPATH],shell=False)
。。。然后,它在MSYS2(记事本的启动位置)中都成功:

$python3 test.py
记事本路径为C:/WINDOWS/system32/notepad.exe
。。。在水蟒3壳蟒蛇3中:

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

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