2009-10-21 29 views
1

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

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

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作为默认字符编码,这会失败吗?或者没有关系?

回答

4

没关系:只要脚本知道要为参数指定utf-8编码,就可以正确解码它。 utf-8是正确的选择,因为它可以让你对任何Unicode字符串进行编码 - 不仅仅是针对某些语言的字符串,而是针对某些语言的字符串,因为诸如Latin-1等选项需要!

+0

+1参数对Unicode没有任何了解,它们只是传递字节,并由您来解释它们。 – bobince 2009-10-21 02:32:40

+1

好的,这就是问题的实质:“参数必须是用户区域编码的字符串,还是只能是任意字节序列?”看起来答案是后者。 谢谢:) – detly 2009-10-21 04:29:51

+0

@detly,是的,好的方式把它!接收参数的过程负责对它们进行解码(如果需要的话),这当然有代价,但它也有一些优势,比如允许“任意字节序列”(只要谁发送序列,收件人,关于其含义,编码等等; - )。 – 2009-10-21 05:38:28

2

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

+0

在程序中的这个特定点上,路径不应该对用户可见。它只是将路径传递给worker子进程的一种机制。 – detly 2009-10-22 01:55:01