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

如何使Python使用包含冒号的路径?,python,path,escaping,colon,Python,Path,Escaping,Colon,我有一个包含嵌入式Python 2.6解释器的程序。调用解释器时,调用PySys_SetPath()将解释器的导入路径设置为安装在包含Python脚本文件的可执行文件旁边的子目录。。。像这样: PySys_SetPath("/path/to/my/program/scripts/type1:/path/to/my/program/scripts/type2"); (除了路径字符串是基于我的程序可执行文件的当前位置动态生成的,而不是像上面的示例中那样硬编码) 这个很好用。。。除非聪明的用户决定在

我有一个包含嵌入式Python 2.6解释器的程序。调用解释器时,调用PySys_SetPath()将解释器的导入路径设置为安装在包含Python脚本文件的可执行文件旁边的子目录。。。像这样:

PySys_SetPath("/path/to/my/program/scripts/type1:/path/to/my/program/scripts/type2");
(除了路径字符串是基于我的程序可执行文件的当前位置动态生成的,而不是像上面的示例中那样硬编码)

这个很好用。。。除非聪明的用户决定在名称中有冒号的文件夹下安装我的程序。在这种情况下,我的PySys_SetPath()命令的结果如下所示(请注意,存在一个名为“path:to”的文件夹):

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

我的问题是,除了告诉用户在他的文件夹名中避免冒号之外,这个问题还有什么解决办法吗


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

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


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

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


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

您遇到的问题是
PySys\u SetPath
函数使用冒号作为分隔符解析您传递的字符串。该解析器将每个
字符视为一条路径的定界,没有办法解决这个问题(无法转义)

但是,您可以通过创建单个路径(每个路径可能包含冒号)的列表来绕过此问题,并使用
PySys\u 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

的一个独特组件。您遇到的问题是
PySys\u SetPath
函数使用冒号作为分隔符来解析传递的字符串。该解析器将每个
字符视为一条路径的定界,没有办法解决这个问题(无法转义)

但是,您可以通过创建单个路径(每个路径可能包含冒号)的列表来绕过此问题,并使用
PySys\u 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的一个独特组件

您是否尝试过用反斜杠转义冒号?所以类似于
PySys_SetPath(r)/path \:to/my/program/scripts/type1:/path \:to/my/program/scripts/type2”)。您是否尝试过用反斜杠转义冒号?所以类似于
PySys_SetPath(r)/path \:to/my/program/scripts/type1:/path \:to/my/program/scripts/type2”)