对subprocess.Popen的参数编码

时间:2009-10-21 01:47:32

标签: python localization subprocess

我有Nautilus文件浏览器的Python扩展(AFAIK只在GNU / Linux / Unix / etc环境下运行)。我决定拆分一个昂贵的计算并将其作为子进程运行,挑选结果并通过管道将其发回。我的问题涉及脚本的参数。由于计算需要路径参数和布尔参数,我想我可以用两种方式做到这一点:在一个管道上发送一个pickle元组中的args,或者在命令行上给它们。我发现pickle tuple方法明显慢于给出参数,所以我采用了subprocess参数方法。

但是,我担心可能出现的本地化问题。目前,我有来电者:

subprocess.Popen(
    [sys.executable, path_to_script, path.encode("utf-8"), str(recurse)],
    stdin = None,
    stdout = subprocess.PIPE)

在剧本中:

path = unicode(sys.argv[1], "utf-8")

我担心的是将路径参数编码为UTF-8是一个错误,但我不确定。我想避免“它适用于我的机器”综合症。如果用户将latin1作为默认字符编码,这会失败吗?或者没关系?

2 个答案:

答案 0 :(得分:4)

没关系:只要您的脚本知道期望对参数进行utf-8编码,它就可以正确解码。 utf-8是正确的选择,因为它可以让你编码任何Unicode字符串 - 不仅仅是某些语言的字符串而不是其他语言,因为像Latin-1这样的选择需要!

答案 1 :(得分:2)

如果用户可以读取文件名,请使用sys.getfilesystemencoding()。但是,当系统编码不支持某些字符时,这可能会导致问题。为避免这种情况,您可以使用某些字符序列替换丢失的字符(例如,通过使用codecs.register_error()注册您自己的错误处理函数)。