将基于1.11'的代码移植到Windows

时间:2015-02-19 23:19:17

标签: python subprocess porting imagemagick-convert

所有迹象似乎都表明我的脚本在Linux环境中完全可以运行,据我所知,阻止它在Windows中工作的唯一方法是使用sh,这非常简单:

from sh import convert

convert(inputfile, '-resize', r, '-quality', q, '-strip', outputfile)

这转换为bash行:

convert image.jpg -resize 350x350 -quality 80 -strip ./small/export.jpg

其中rq变量是任何给定的分辨率或质量。


在Windows中运行它当然会引发错误,因为'sh'在Windows中完全不起作用:(我尝试用不推荐的pbs替换'sh',但是没有运气。这就是我到目前为止:

import pbs

pbs.convert('-resize', r, '-quality', q, '-strip', inputfile, outputfile)

引发的错误是:

  File "C:\Python27\lib\site-packages\pbs.py", line 265, in _create
    if not path: raise CommandNotFound(program)
pbs.CommandNotFound: convert

问题:

  

如何在Windows环境中从我的脚本成功传递这些ImageMagick命令?

4 个答案:

答案 0 :(得分:8)

关注Kevin Brotcke' answer,这就是我们遇到的黑客行为:

try:
    import sh
except ImportError:
    # fallback: emulate the sh API with pbs
    import pbs
    class Sh(object):
        def __getattr__(self, attr):
            return pbs.Command(attr)
    sh = Sh()

答案 1 :(得分:4)

pbs.CommandNotFound错误消息是因为pbs没有convert方法。相反,您需要使用Command方法:

import pbs
convert = pbs.Command('convert')

现在您可以使用它类似于sh

convert(inputfile, '-resize', r, '-quality', q, '-strip', outputfile)

答案 2 :(得分:1)

子流程是您最好的选择。虽然,正如你所说,它不是最容易学习的,但它确实非常有用。我会看this indepth tutorial。当然,也请阅读the docs

至于你的具体问题,sh的时间比pbs长,所以它几乎肯定有更多的功能。浏览源代码(pbs.py),我发现没有名为convert()的函数。此外,您将所调用的参数从sh更改为pbs(您没有放置inputfile)。最后,来自git repo的convert()中没有名为sh.py的函数,所以我怀疑你将它与来自其他东西的转换混淆。

除此之外,您应该能够同时使用pbssubprocess

答案 3 :(得分:0)

您可以use stdlib's subprocess module在Windows上运行命令:

#!/usr/bin/env python
from subprocess import check_call

check_call(r'c:\path\to\ImageMagick\convert.exe image.jpg -resize 350x350 -quality 80 -strip small\export.jpg')

提供带有文件扩展名的完整路径非常重要,否则为different convert command may be chosen

如果check_call()以非零状态退出,则

convert会引发异常。您可以使用subprocess.call()并手动检查状态。