我有一个包含嵌入式 Python 2.6 解释器的程序。当我调用解释器时,我调用 PySys_SetPath() 将解释器的导入路径设置为安装在我的可执行文件旁边的子目录,其中包含我的 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”,因此所有导入语句都不起作用。
我的问题是,除了告诉用户避免在其文件夹名称中使用冒号之外,是否有任何解决此问题的方法?
我查看了 Python/sysmodule.c 中的 makepathobject() 函数,它似乎不支持任何类型的引用或转义来处理文字冒号……但也许我遗漏了一些细微差别。
最佳答案
您遇到的问题是 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
的一个独特组件。
关于python - 如何让 Python 使用包含冒号的路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5750982/