当前位置:  开发笔记 > 编程语言 > 正文

为什么这个Python子进程命令仅在Windows上的shell = True时有效?

如何解决《为什么这个Python子进程命令仅在Windows上的shell=True时有效?》经验,为你挑选了1个好方法。

我有一个涉及多个subprocess.call命令的python脚本.我在Mac上编写了脚本,它运行得很好.我刚尝试在Windows上运行它,我对错误感到困惑.

以下命令调用ImageMagick返回"退出状态4":

file1 = "D:/Temp/OCR_test/sample/images/crops/time_0011.png"
subprocess.call(['convert', file1, '-resize', '200%', file1])

将命令更改为以下作品:

subprocess.call(['convert', file1, '-resize', '200%', file1], shell=True)

shell=True由于文档中的警告,我有点担心使用.
我还需要命令在Mac和Windows上工作,我很困惑为什么它不能在Windows上工作(我检查过命令确实可以使用Windows CMD).

有趣的是,以下行脚本早期工作(其中file,lat_crop1croplat被定义的变量):

subprocess.call(['ffmpeg', '-loglevel', 'panic', '-i', file, '-vf', lat_crop1, '-n', croplat])  

我读了这个问题并尝试了所有建议(shlex,我的命令的变化等等),但我仍然得到相同的结果.

任何人都知道如何修改该行,以便它可以无需工作shell=True

另外,"退出状态4"是什么意思?我用Google搜索并阅读了如此多的文档但却一无所获.

编辑:根据答案中提供的信息,我更改为无法工作的命令,并subprocess.call(['mogrify', file1, '-resize', '200%', file1])在Windows上的Python中成功运行.幸运的是,ImageMagick提供mogrify了替代方案convert.



1> Jean-Françoi..:

我怀疑你正在调用C:\Windows\System32\convert.exe(NTFS/FAT分区转换器)而不是imagemagick.

shell=True路径从imagemagick中找到convert.bat或者convert.cmd脚本时,如果没有它,路径只能找到.exe文件,这是一个完全不同的程序,你得到错误4:无效参数.

在这种特殊情况下,即使使用可执行文件它也不起作用,因为"错误" convert位于系统路径中.shell=False只搜索系统路径(python subprocess Popen environment PATH?).因此,名为的程序convert位于系统路径中的运气不佳.

尝试显式添加.bat扩展名,如下所示:

subprocess.call(['convert.bat', file1, '-resize', '200%', file1])

要知道可能运行哪些可执行文件,您可以键入:

where convert

在命令提示符下.

在您的情况下(可执行文件),可以通过传递您要运行的可执行文件的绝对路径来解决问题.

另一种方法是将ImageMagick复制/重命名convertimconvert.哪个程序自称convert并且不期望冲突?

或者在这种情况下,退出是合法的shell=True,并且有一个很好的评论解释说微软留下了一个令人困惑的(并且很少使用convert系统路径中的程序让我们进入)

解决方案并不漂亮,至少有一些.


[`CreateProcess`](https://msdn.microsoft.com/en-us/library/ms682425)总是在`PATH`之前搜索系统目录并尝试追加".EXE".另一方面,cmd shell自己搜索`PATH`,并尝试在`PATHEXT`中附加扩展名,然后使用它找到的文件的完全限定路径调用`CreateProcess`.
推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有