如何让Python使用包含冒号的路径?

时间:2011-04-21 23:47:20

标签: python path escaping colon

我有一个包含嵌入式Python 2.6解释器的程序。当我调用解释器时,我调用PySys_SetPath()来设置解释器的import-path到我的可执行文件旁边安装的子目录,这些子目录包含我的Python脚本文件......像这样:

PySys_SetPath("/path/to/my/program/scripts/type1:/path/to/my/program/scripts/type2");

(除了路径字符串是根据我程序的可执行文件的当前位置动态生成的,而不是如上例所示的硬编码)

这很好用......除非聪明的用户决定在我的名字中有冒号的文件夹下安装我的程序。在这种情况下,我的PySys_SetPath()命令最终看起来像这样(注意存在名为“path:to”的文件夹):

PySys_SetPath("/path:to/my/program/scripts/type1:/path:to/my/program/scripts/type2");

...这打破了我所有的Python脚本,因为现在Python在“/ path”和“to / my / program / scripts / type1”而不是“/ path:to / myprogram /”中查找脚本文件scripts / type1“,因此所有import语句都不起作用。

我的问题是,除了告诉用户在文件夹名称中避免使用冒号之外,是否有解决此问题的方法?

我查看了Python / sysmodule.c中的makepathobject()函数,它似乎不支持任何类型的引用或转义来处理文字冒号....但也许我错过了一些细微差别。

2 个答案:

答案 0 :(得分:6)

您遇到的问题是PySys_SetPath函数使用冒号作为分隔符来解析您传递的字符串。该解析器将每个:字符视为分隔路径,并且无法解决此问题(无法转义)。

但是,您可以通过创建单个路径列表(每个路径可能包含冒号)来绕过此操作,并使用PySys_SetObject设置sys.path

PyListObject *path; 

path = (PyListObject *)PyList_New(0); 
PyList_Append((PyObject *) path, PyString_FromString("foo:bar")); 
PySys_SetObject("path", (PyObject *)path); 

现在,翻译人员会将"foo:bar"视为sys.path的独特组成部分。

答案 1 :(得分:2)

在文件路径中支持冒号在多个操作系统上打开了大量的蠕虫;例如,它不是Windows或Mac OS X上的有效路径字符,并且出于这个原因,在脚本环境的上下文中支持它似乎不是特别合理。我实际上有点惊讶Linux也允许冒号文件名,特别是因为:是一个非常常见的路径分隔符。

您可以尝试将冒号转出,即将/ path:转换为/ to / path \:to /并查看是否有效。除此之外,只需告诉用户避免在文件名中使用冒号。他们会在很多不同的环境中遇到各种各样的问题,这只是一个简单的坏主意。