我有一组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二进制文件具有执行权限......
所以我的问题是。这个问题是否已知?什么是解决它的最干净的方法?
谢谢!
答案 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