问题标签 [import-hooks]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3427 浏览

python-3.x - PEP 302 示例:新的导入挂钩

在哪里可以找到PEP 302中描述的“新导入挂钩”的示例实现?

我想以最前向兼容的方式实现自定义查找器和加载器。换句话说,实现应该在 python 2.x 和 3.x 中工作。

0 投票
2 回答
2043 浏览

python - 多次导入同一个模块

所以几个小时后,我发现了我的应用程序中出现错误的原因。我的应用程序的源结构如下:

实际上,还有大约 50 个文件。但这不是重点。在main/__init__.py,我有这个代码:from folderA.fileA import *

folderA/__init__.py我有这个代码:

folderA/fileB.py我有这个代码:

问题是 fileA 被导入两次。但是,我只想导入一次。

解决这个问题的明显方法(至少对我而言)是将某些路径pathfolderA.path

但我觉得 Python 一开始就不应该出现这个错误。还有哪些其他解决方法不需要每个文件都知道其绝对位置?

0 投票
1 回答
5649 浏览

python - Python 中特定于包的导入钩子

我正在创建一个 Python 模块,将不同语言/框架提供的 API 映射到 Python 中。理想情况下,我希望将其呈现为单个根包,该包公开辅助方法,并将该其他框架中的所有命名空间映射到 Python 包/模块。为了方便,我们以CLR为例:

clr是一个神奇的顶级包,它公开了 CLR 命名空间System.DataSystem.Windows.Forms子包/子模块(据我所知,一个包只是一个带有子模块/包的模块;其中包含其他类型的成员仍然有效)。

我已经阅读了PEP-302并编写了一个简单的原型程序,通过安装自定义meta_path钩子实现了类似的效果。模块本身是一个合适的clrPython 模块,在导入时会设置__path__ = [](使其成为一个包,以便import甚至尝试查找子模块),并注册钩子。钩子本身拦截任何包全名以 开头的包加载,使用"clr."动态创建新模块imp.new_module(),将其注册到 中sys.modules,并使用精灵灰尘和彩虹填充原始 API 中的类和方法。这是代码:

clr.py

测试.py

总而言之,这似乎工作正常。Python 保证链中的模块是从左到右导入的,因此clr总是首先导入,并且它设置了允许导入链的其余部分的钩子。

但是,我想知道我在这里所做的是否是矫枉过正。毕竟,我正在安装一个全局钩子,任何模块导入都会调用它,即使我过滤掉了我不关心的那些。是否有某种方法可以安装一个只会从我的特定包导入而不是其他包的钩子?或者上面是在Python中做这种事情的正确方法吗?

0 投票
1 回答
249 浏览

python - 找不到动态加载模块中定义的函数

我对python很陌生。这是我遇到的问题。我已经将内置._ import _ 与我的自定义挂钩挂钩,该挂钩从字符串加载模块。

然后我在函数中使用这个钩子,它正在加载一个模块并在 exec 语句中调用它的函数。

当我运行此代码时,我在“return ILessons_1(request);”行中收到错误“未定义全局名称 'ajay'”。有趣的是,python 能够在这条线上方的线上解析 ajay。我很确定我在 exec 语句中犯了一些错误,但无法弄清楚。

有人可以帮我解决这个问题。谢谢

0 投票
1 回答
124 浏览

python - Python导入钩子:导入错误的引用中没有文件名

我根据PEP 302编写了一个导入钩子,除了一个烦人的细节外,它似乎工作正常。当出现导入错误时,比如说尝试导入不存在的模块的代码,我会得到一个引用,如下所示:

第 10 行是对不存在的导入的调用所在的位置,但没有文件名,只有<string>.
我的导入钩子看起来很像PEP 302中的最小钩子。在创建模块时,我总是将正确的字符串值设置为__file__,甚至检查是否new_module()将正确的值设置为__name__. 此外,模块的 和 都str()返回repr()一些信息。

trackback 中的这些无名文件使调试导入错误变得困难。引用从哪里获取文件名?为什么它看不到模块的名称?


编辑 - 再想一想,可能是因为模块代码是使用exec(). 是否可以提供exec()文件名?

0 投票
0 回答
116 浏览

python - 编写一个 PEP-302 导入钩子,它知道哪个模块正在导入哪个

假设我有模块foo.pybar.py并且它们的代码中都有import baz语句。

我想编写一个导入钩子,我可以插入sys.meta_path它知道baz是从 导入foo还是从bar.

我想这样做的原因是因为我希望我的应用程序能够加载插件并保持它们的依赖项隔离,就像我可以通过ClassLoader在 Java 中使用单独的实例一样。这样,插件foo和插件bar将能够捆绑不同版本的库baz而不会发生冲突。我的意思是通过更改导入机制来为import baz语句生成单独的模块,具体取决于该语句的来源。

如果有人有更好的方法,请随时在您的答案中提出建议。

0 投票
0 回答
152 浏览

python - 导入钩子,在任何时候进行导入时打印

我有一个 python 模块和一个单元测试。当我运行单元测试时,我得到了这个:

我知道错误是不言自明的,但我找不到“导入 gobject”发生的位置,所以我被建议制作一个导入钩子,它会在任何时候进行导入时打印。我不知道在哪里以及如何实现钩子,我只在这里http://xion.org.pl/2012/05/06/hacking-python-imports/阅读了一些关于导入钩子的内容。任何帮助表示赞赏

0 投票
1 回答
196 浏览

python-2.7 - Python 2 中的假命名空间包

PEP 302——新的导入挂钩指定了挂钩 Python 导入机制的方法。其中之一是创建一个模块查找器/加载器并将其添加到sys.meta_path.

我寻求创建一个能够重新路由子包导入的模块查找器。所以假设我写import mypackage.sub它应该实际导入模块mypackage_sub

我尝试在不成功的地方实现这样的模块查找器。现在,我将查找器类安装在 Python 主文件中,但我的目标是将它安装在根包mypackage中。

finder 将收到与 的电话.find_module(fullname, path)'mypackage'但永远不会与'mypackage.sub'。因此,我只收到以下代码的以下错误。

这是该_ExtensionFinder课程的代码。我感谢任何允许我将此类_ExtensionFinder放入根模块的解决方案mypackage

编辑:我发现描述我想要实现的正确词语是“命名空间包”

0 投票
2 回答
9473 浏览

python - 如何实现一个可以使用 importlib 即时修改源代码的导入钩子?

使用不推荐使用的模块imp,我可以编写一个自定义导入钩子,在 Python 导入/执行之前动态修改模块的源代码。给定源代码作为source下面命名的字符串,创建模块所需的基本代码如下:

由于imp已弃用,我想对importlib. imp[编辑:需要替换其他方法来构建自定义导入挂钩 - 所以我正在寻找的答案不仅仅是替换上面的代码。]

但是,我无法弄清楚如何做到这一点。importlib文档具有从“规范”创建模块的功能,据我所知,这些是包含自己的加载器的对象,没有明显的方法来重新定义它们以便能够从字符串创建模块。

我创建了一个最小的示例来演示这一点;有关详细信息,请参阅自述文件。

0 投票
1 回答
146 浏览

python - python将包运送到远程机器并从内存中导入

我试图在远程机器上运行和使用 python 包而不部署或安装包。

在以下链接中,它很好地描述了如何为模块创建字符串导入器。模块文件被读取并作为文本存储在字典中。存储在内存中并使用 StringImporter 导入挂钩加载。

我可以使用相同的实现,将我的模块读入字典,使用套接字通信发送相同的字典并在远程机器上使用相同的 StringImporter 来导入模块。

但我仍在努力运送如下所示的包裹