Dmi*_*ant 5 python windows subprocess popen
我想使用Popen从我的Python脚本中调用ImageMagick中的"convert"实用程序,如下所示:
Popen(["convert", input_path, "-flop", output_file_path])
Run Code Online (Sandbox Code Playgroud)
(上面的例子只是水平反转图像)
问题是,当我在Windows中运行脚本时,它错误地调用convert.exe
Windows附带的实用程序将FAT分区转换为NTFS!(位于\ Windows\system32)
现在,如果我在system32以外的任何目录中随机打开命令提示符,并键入"convert",它会正确运行ImageMagick可执行文件.所以,这意味着Popen会自动查看system32.如何让它不在system32中查看,并运行正确的可执行文件?
搜索程序并非易事.我明确地指定了convert.exe可执行文件的完整路径.
subprocess
CreateProcess
在Windows上system32
%PATH%
使用甚至在以下任何其他目录之前查看目录:
...如果文件名不包含扩展名,
.exe
则追加.因此,如果文件扩展名为.com,则此参数必须包含.com扩展名.如果文件名以句点(.)结尾但没有扩展名,或者文件名包含路径,则不附加.exe.如果文件名不包含目录路径,系统将按以下顺序搜索可执行文件:
因此在这种情况下convert
相当于convert.exe
.它首先查找包含sys.executable
例如的目录C:\Python27
.然后在当前目录中:从哪里开始Python脚本.然后在system32
它找到的地方convert.exe
(filesystem utility,而不是imagemagick).
您可以尝试从中删除system32目录os.environ['PATH']
(?)禁止检查它:Popen(cmd, env=no_system32_environ)
但它很脆弱(比显式路径更糟).
Python bug跟踪器存在一个相关问题:"Subprocess在Windows上选择了错误的可执行文件."
cmd.exe
(shell)使用不同的算法.请参阅Windows如何在shell中找到输入的文件?
如果您设置shell=True
了convert
程序的搜索顺序:
convert
不是内部shell命令%PATHEXT%
定义的文件扩展名进行检查以什么顺序例如,convert.com,CONVERT.EXE,convert.bat,convert.cmd如果%PATHEXT%
是.com;.exe;.bat;.cmd
.