我有一组想同时在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二进制文件具有执行权限...
所以我的问题是。这个问题是已知的吗?最干净的解决方法是什么?
谢谢!
[不确定这是否可以正确地回答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