2011-04-21 167 views
1

我有一个包含嵌入式Python 2.6解释器的程序。当我调用解释,我打电话PySys_SetPath()来解释的进口路径设置为一个已安装到我的可执行文件,包含我的Python脚本文件的子目录...这样的:如何让Python使用包含冒号的路径?

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

(除了路径字符串是基于我的程序的可执行文件的当前位置动态生成的,而不是像上例中的硬编码)

这工作正常......除非聪明的用户决定将我的程序安装在具有冒号在它的名字。在这种情况下,我的PySys_SetPath()命令结束这样看(注意一个名为“路径:以”文件夹中的存在):

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”中查找脚本文件,因此没有任何导入语句可用。

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

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

+1

你是否尝试用反斜杠转义冒号?所以像'PySys_SetPath(r“/ path \:to/my/program/scripts/type1:/ path \:to/my/program/scripts/type2”);'。 – 2011-04-21 23:51:49

回答

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

+0

工程就像一个魅力,感谢:^) – 2011-04-22 03:53:18

+0

伟大的,很高兴听到它! – samplebias 2011-04-22 03:54:06

2

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

你可能会尝试转义冒号,即转换/路径:到/到/路径\:到/并看看是否有效。除此之外,请告诉用户避免在其文件名中使用冒号。他们会在很多不同的环境中遇到各种各样的问题,而这只是一个简单的坏主意。