如何使用Python正确执行转换命令

3

我刚接触Python,所以如果我的问题看起来愚蠢,请原谅。

我正在尝试使用这个工具将GIF文件转换为APNG。

正如这个页面底部所述,要将GIF转换为APNG,您必须执行以下命令:

$ vertopal convert GIF_INPUT_FILE --to apng

在终端中运行命令时,它正常工作,但我无法在我的Python代码中实现它。

这是我的代码:

import subprocess

discord_sticker_converter = subprocess.call("vertopal convert funny cat.gif --to apng")
print(discord_sticker_converter)

这是输出中打印的内容:
usage: vertopal [options] <command> [<args>]
vertopal: error: unrecognized arguments: cat.gif
2

如何正确调用转换命令?
3个回答

3
让我们来谈谈你的命令:
"vertopal convert funny cat.gif --to apng"

名字为"funny cat.gif"的文件名中有空格。 subprocess 调用 shlex.split() 将这个字符串分割成一个字符串令牌列表,结果如下:

>>> shlex.split("vertopal convert funny cat.gif --to apng")
['vertopal', 'convert', 'funny', 'cat.gif', '--to', 'apng']

如你所见,文件名被分成了两个标记:"funny"和"cat.gif"。这就是为什么它失败了。要解决这个问题,你需要正确引用你的文件名:
>>> shlex.split("vertopal convert 'funny cat.gif' --to apng")
['vertopal', 'convert', 'funny cat.gif', '--to', 'apng']

函数subprocess.call()非常灵活:它可以接受一个字符串并尝试拆分它,也可以接受一个字符串列表。这意味着以下两种方式都可以使用:
subprocess.call("vertopal convert 'funny cat.gif' --to apng")
subprocess.call(['vertopal', 'convert', 'funny cat.gif', '--to', 'apng'])

第一种形式更紧凑,适用于在终端中使用。第二种形式更明确。使用哪种形式取决于你自己。至于我,我会选择第二种形式,因为Python之禅说过:
明确胜于隐晦。

这是一条非常有用的信息。 - FireStarter
这是一条非常有用的信息。 - FireStarter
这是一条非常有用的信息。 - undefined

3
你需要将它制作成列表并运行。
import subprocess

command = ["vertopal", "convert", "funny cat.gif", "--to", "apng"]
discord_sticker_converter = subprocess.call(command)
print(discord_sticker_converter)

我们发送列表是否有特定的原因? - FireStarter
我们发送清单有没有特定的原因? - FireStarter
2
@FireStarter,原因是你可以处理空格,出于安全考虑,不进行Shell解析。通过使用列表,命令执行更安全、更高效。 - Indra Dwi Aryadi
2
@FireStarter,原因是你可以处理空格,出于安全考虑,不进行Shell解析。通过使用列表,命令执行更加安全和高效。 - Indra Dwi Aryadi
2
@FireStarter,原因是你可以处理空格,出于安全考虑,不进行Shell解析。通过使用列表,命令执行更安全、更高效。 - undefined

1
根据您运行此脚本的平台,您可能希望将命令编写为字符串列表而不仅仅是一个字符串。
discord_sticker_converter = subprocess.call(
    ["vertopal", "convert", "funny cat.gif", "--to", "apng"]
)

Python docs建议使用字符串列表而不是单个字符串,原因有很多,其中之一是参数解析并非易事,特别是当参数包含空格字符时(这就是你的情况)。

在你的实现中,funnycat.gif会被解释为两个不同的参数。将它们融合在一个字符串列表中可以明确地表示funny cat.gif是一个整体的参数。


抱歉,但它仍然显示相同的错误。 - FireStarter
抱歉,但它仍然显示相同的错误。 - FireStarter
抱歉,但它仍然显示相同的错误。 - undefined
1
抱歉,我在你的实现中错过了真正的错误。希望更新后的答案能让事情更清楚 :) - alexis_thual
1
抱歉,我在你的实施中错过了真正的错误。希望更新后的答案能让事情更清楚 :) - alexis_thual
1
抱歉,我错了,我错过了你实现中的真正错误。更新后的答案希望能让事情更清楚 :) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接