我有一个涉及多个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_crop1
和croplat
被定义的变量):
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
.
我怀疑你正在调用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复制/重命名convert
为imconvert
.哪个程序自称convert
并且不期望冲突?
或者在这种情况下,退出是合法的shell=True
,并且有一个很好的评论解释说微软留下了一个令人困惑的(并且很少使用convert
系统路径中的程序让我们进入)
解决方案并不漂亮,至少有一些.