subprocess.Popen中参数的编码
我有一个Python扩展,用于Nautilus文件浏览器(据我所知,这个扩展主要在GNU/Linux/Unix等环境下运行)。我决定把一个耗时的计算分离出来,作为一个子进程运行,然后把结果进行序列化(也就是“打包”),通过管道发送回去。我的问题是关于传递给脚本的参数。因为这个计算需要一个路径参数和一个布尔值参数,我想到了两种方法:一种是通过管道发送一个打包的元组,另一种是在命令行中直接给参数。我发现使用打包的元组明显比直接给参数慢,所以我选择了第二种方法。
不过,我对可能出现的本地化问题有些担心。目前,在调用者那边我有:
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 个回答
2
如果你想让文件名对用户可读,可以使用 sys.getfilesystemencoding()
这个方法。不过,这样做可能会遇到一些问题,特别是当文件名中有系统编码不支持的字符时。为了避免这些问题,你可以用一些字符序列来替代那些缺失的字符,比如通过注册你自己的错误处理函数来实现,具体可以参考 codecs.register_error()
。
4
这没关系:只要你的脚本知道要用utf-8编码来处理这个参数,它就能正确解码。utf-8是个不错的选择,因为它可以编码任何Unicode字符串——不仅仅是某些语言的字符串,而是所有语言的字符串,像Latin-1这样的选择就只能处理一部分语言。