【问题标题】:Arbitrary python names with slashes in import statement导入语句中带有斜杠的任意 python 名称
【发布时间】:2011-12-19 14:56:08
【问题描述】:

浏览了相关问题,但找不到这个具体的答案。

我们将 python 嵌入到我们的应用程序中,并在 sys.meta_path 中添加了一个钩子 允许导入任意命名的模块。 (也就是说,模块定义不在磁盘上,而是在内存中定义包中)。

这允许这样的事情:

import my_module_1#2#31421

甚至:

__import__("my_module_1#2#31321")

当特定标签本身包含斜杠时会出现问题。

import my_module_1/123/56

__import__("my_module_1/123/56")

在读取我的 meta_path 钩子之前,它会产生以下错误。

ImportError:不支持按文件名导入。

我也尝试过:

import imp imp.load_source('my_module_1', '123/56')

但同样,这甚至没有到达 meta_path 钩子。 我需要传递的任意名称实际上类似于“路径”,但不要引用磁盘路径。

有人有什么建议吗?

非常感谢, 抢。

【问题讨论】:

  • 在我看来这是python实现中的错误,假设遇到斜杠时名称是文件名。它应该通过常规机制(meta_path 挂钩等)进行,并像往常一样报告错误。不明白这种冒昧错误的必要性?
  • 它们是否足够像路径,以至于您可以将它们视为包,具有适当的__init__.pys,并且像处理常规文件一样使用点符号?

标签: python syntax import names


【解决方案1】:

嗯,一个明显的解决方法是在源代码中使用一些不同的字符,例如管道,并让你的钩子用斜杠替换这些字符。不过,这或多或少会让人感到痛苦。

例如

import lol|foo

你的钩子第一行的样子

module_name = module_name.replace ('|', '/')

【讨论】:

  • 这将是我们脚本语言中的一个重大漏洞。我是否正确假设,这个 python 错误没有任何意义,因为它错误地假设我传入了一个文件名,而它本身允许不在磁盘上的模块?
  • 好吧,因为这通常是一个错误,可能是的。我想这些事情最好在 CPython 邮件列表上讨论。除非您愿意自编译 Python 解释器,否则我看不到解决此错误的“正确”方法。
  • 无论哪种方式都不会出错,因为 meta_path 挂钩会正确拦截和处理某些名称而不会失败。我会在 cpython 邮件列表上询问(我认为那是询问更改的最佳地点?)谢谢!
  • 我的意思是这将是标准环境的错误(标准 Python 模块名称中不允许使用斜线,不是吗?),因此更明确的错误是多余的。如果它是在钩子有发言权之后抛出的,那么它也是无害的。也许 CPython 开发人员认为类似路径的斜杠太糟糕了,他们甚至不想让钩子运行,但更有可能这是一个疏忽(例如,Windows 路径反斜杠似乎没有被特殊处理,至少在 Linux 上)。
  • 酷。我会把它提交到 bugs.python.org 看看会发生什么。感谢您帮助我澄清。
猜你喜欢
  • 2012-09-10
  • 2018-05-06
  • 2016-11-09
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
相关资源
最近更新 更多