Popen具有冲突的可执行文件/路径

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.exeWindows附带的实用程序将FAT分区转换为NTFS!(位于\ Windows\system32)

现在,如果我在system32以外的任何目录中随机打开命令提示符,并键入"convert",它会正确运行ImageMagick可执行文件.所以,这意味着Popen会自动查看system32.如何让它不在system32中查看,并运行正确的可执行文件?

jfs*_*jfs 7

搜索程序并非易事.我明确地指定了convert.exe可执行文件的完整路径.

subprocessCreateProcess在Windows上system32%PATH%使用甚至在以下任何其他目录之前查看目录:

...如果文件名不包含扩展名,.exe则追加.因此,如果文件扩展名为.com,则此参数必须包含.com扩展名.如果文件名以句点(.)结尾但没有扩展名,或者文件名包含路径,则不附加.exe.如果文件名不包含目录路径,系统将按以下顺序搜索可执行文件:

  1. 加载应用程序的目录.
  2. 父进程的当前目录.
  3. 32位Windows系统目录.使用GetSystemDirectory函数获取此目录的路径.
  4. 16位Windows系统目录.没有函数可以获取此目录的路径,但会搜索它.该目录的名称是System.
  5. Windows目录.使用GetWindowsDirectory函数获取此目录的路径.
  6. PATH环境变量中列出的目录.请注意,此功能不会搜索App Paths注册表项指定的每个应用程序路径.要在搜索序列中包含此每个应用程序路径,请使用ShellExecute函数.

因此在这种情况下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=Trueconvert程序的搜索顺序:

  1. convert 不是内部shell命令
  2. 没有明确的路径,所以继续搜索
  3. 搜索当前目录
  4. 按列出的顺序搜索PATH环境变量指定的每个目录

%PATHEXT%定义的文件扩展名进行检查以什么顺序例如,convert.com,CONVERT.EXE,convert.bat,convert.cmd如果%PATHEXT%.com;.exe;.bat;.cmd.