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

Jer*_*ner 1 python escaping path colon

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

PySys_SetPath("/path/to/my/program/scripts/type1:/path/to/my/program/scripts/type2");
Run Code Online (Sandbox Code Playgroud)

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

这工作正常......除非聪明的用户决定在我的名称中包含冒号的文件夹下安装我的程序.在这种情况下,我的PySys_SetPath()命令最终看起来像这样(注意存在名为"path:to"的文件夹):

PySys_SetPath("/path:to/my/program/scripts/type1:/path:to/my/program/scripts/type2");
Run Code Online (Sandbox Code Playgroud)

...这打破了我所有的Python脚本,因为现在Python在"/ path"和"to/my/program/scripts/type1"而不是"/ path:to/myprogram/scripts/type1"中查找脚本文件",所以没有任何导入语句有效.

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

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

sam*_*ias 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); 
Run Code Online (Sandbox Code Playgroud)

现在,解释器将被"foo:bar"视为一个独特的组成部分sys.path.