我正在使用Python 2.7.6,我在将一些png文件转换为gif时遇到了问题(为了创建动画)
os.system("convert -delay 1 -dispose Background +page " + str(output_dir)
+ "/*.png -loop 0 " + str(output_dir) + "/animation.gif")
这是我的错误
ParamŠtrenonvalide - 1
答案 0 :(得分:1)
如果没有足够的信息继续下去,这只是猜测,但是......
如果output_dir
有任何空格或引号或其他特殊字符,那么您无法逃避或引用它们,因此您的命令行将如下所示:
convert -delay 1 -dispose Background +page ~/My Pictures/*.png -loop 0 ~/My Pictures/animation.gif
也许~/My
是发送输入的完全有效的参数,Pictures/*.png
恰好解析为convert
愿意处理的一大堆额外的相对路径输入,但是你输出~/My
,这是无效的,因为它与输入相同,而Pictures/animation.gif
作为一些额外的参数在convert
结束时加上不知道该怎么办。
你可以通过使用repr(output_dir)
来解决这个问题,这将使用适当的Python文字引用,这通常但不总是足以用作bash引用......但是这是一个非常糟糕的主意。
更好的方法是让Python为您做适当的引用。正如os.system
文档所说:
subprocess
模块提供了更强大的工具来生成新流程并检索其结果;使用该模块比使用此功能更可取。
使用subprocess
,您只需传递一个参数列表,而不是尝试将它们组成一个有效的命令行,甚至不使用shell - 尽管那时你需要自己做globbing而不是让它们贝壳做到了。
当你使用它时,使用os.path
方法而不是字符串方法来处理路径要好得多。
例如:
args = (['convert', '-delay', '1', '-dispose', 'Background', '+page'] +
glob.glob(os.path.join(output_dir, '*.png')) +
['-loop', '0', os.path.join(output_dir, 'animation.gif')])
subprocess.check_call(args)
或者,您仍然可以使用shell,但随后使用shlex.quote
为您引用每个参数,正如文档所解释的那样。
更好的解决方案是首先使用三个Python bindings to ImageMagick中的任何一个,而不是尝试构建命令行来驱动ImageMagick命令行工具。