import 语句中带有斜杠的任意 python 名称

发布于 2024-12-13 03:50:59 字数 697 浏览 4 评论 0原文

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

我们将 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 挂钩之前它会创建以下错误。

导入错误:不支持按文件名导入。

我也尝试过类似的操作:

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

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

有人有什么建议吗?

非常感谢, 抢。

Gone through related questions,but cannot find this specific answer.

We're embedding python into our application, and have added a hook to sys.meta_path
to allow the import of arbitrarily named modules.
(That is, module definitions do not reside on disk, but are defined in memory within the package).

This allows things like:

import my_module_1#2#31421

or even:

__import__("my_module_1#2#31321")

The problem occurs when the specific label itself contains a slash.

import my_module_1/123/56

or

__import__("my_module_1/123/56")

It creates the following error, before even reading my meta_path hook.

ImportError: Import by filename is not supported.

Ive also tried things like:

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

But again, this does not even reach the meta_path hook.
The arbitrary names I need to pass are actually 'path' like, but do not refer to disk paths.

Does anyone have any suggestions?

Thanks very much,
Rob.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

擦肩而过的背影 2024-12-20 03:50:59

好吧,一个明显的解决方法是在源中使用一些不同的字符,例如管道,并让您的钩子用斜杠替换这些字符。不过,这取决于您到底需要什么,这或多或少会带来痛苦。

例如

import lol|foo

,你的钩子的第一行看起来像

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

Well, an obvious workaround would be to use some different character in the sources, e.g. pipe, and have your hook replace such characters with slashes. Depending on what exactly you need that would be more or less painful, though.

E.g.

import lol|foo

where the first line of your hook looks like

module_name = module_name.replace ('|', '/')
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文