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

标签 python path escaping

我有一个包含嵌入式 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/

相关文章:

python - hashlib 中 `block_size` 和 `digest_size` 之间的区别?

.net - LocalUserAppDataPath 和 UserAppDataPath 有什么区别?

python IDLE shell 似乎无法正确处理一些转义

c# 如何转义具有不同字母的目录路径?

Javascript:从 json 字符串中转义“

python - 将数字追加到列表的指定元素中

python - Python 中的双和

Python readlines Api 从串口访问时需要很长时间

java - 我如何告诉 Java 在哪里可以找到 native 库?

c - 如何将-o生成的C程序输出添加到$PATH?