【问题标题】:How to make Python use a path that contains colons in it?如何让 Python 使用其中包含冒号的路径?
【发布时间】:2011-04-21 23:47:20
【问题描述】:

我有一个包含嵌入式 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",因此所有 import 语句都不起作用。

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

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

【问题讨论】:

  • 你试过用反斜杠转义冒号吗?所以像PySys_SetPath(r"/path\:to/my/program/scripts/type1:/path\:to/my/program/scripts/type2");.

标签: python path escaping colon


【解决方案1】:

您遇到的问题是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 的一个独特组成部分。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 1970-01-01
      • 2021-08-28
      • 2012-11-21
      • 2010-11-18
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      相关资源
      最近更新 更多