所有迹象似乎都表明我的脚本在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
其中r
和q
变量是任何给定的分辨率或质量。
在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命令?
答案 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
的函数,所以我怀疑你将它与来自其他东西的转换混淆。
除此之外,您应该能够同时使用pbs
和subprocess
。
答案 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()
并手动检查状态。