问题标签 [python-importlib]

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 回答
114 浏览

python-3.x - 导入并运行文件

我对 Python 有点陌生,出于某种原因,我无法理解某些东西。

从命令行我运行这个

python3 myfile.py

它工作,在文件的底部是这个,它运行我的类,运行类的位如下所示(我刚刚包含了一些调用其余部分的部分

我想做的是从我的代码中运行完整的文件,我试过这个

这似乎读取了文件(我在顶部有一个打印行,它似乎确实有效,但实际上没有执行任何操作。我确信我错过了有关 Python 工作方式的一些基本知识,但我有点迷失了。

编辑我想我可能会以错误的方式解决这个问题,并认为我的问题可能是。如何将文件主要部分中的内容移动到导入到正在执行导入的文件中

要导入的文件是这样的

然后在正在导入的文件中

我得到的错误是:模块'unittest'没有属性'mymodule'

那么我需要做什么才能使我的代码(主要是)在我正在执行导入的视图中工作?

0 投票
1 回答
558 浏览

python - 使用 module_from_spec 加载的 python 类中缺少源信息

我正在尝试使用 Python 的自省模块inspect来检索已module_from_spec使用importlib.util. 尝试inspect.getsource()在 spec_file 本身或 spec 文件中的任何函数上使用都会成功返回所需的源代码。但是,用于检索规范文件中类类型的源代码的相同方法会抛出一个TypeError: None is a built-in class.

罪魁祸首似乎是inspect.getfile()函数对象返回对象的回溯链中的调用。__code__而类对象尝试加载它们的模块以检索模块。__file__. 为什么函数有__code__方法,而类没有?这是 Python 如何处理无意中破坏动态加载类的自省的类型的副作用吗?

0 投票
2 回答
21318 浏览

python - Import class from module dynamically

I have class called 'my_class' placed in 'my_module'. And I need to import this class. I tried to do it like this:

but it says:

So. As I can see it works only for modules, but can't handle classes. How can I import a class from a module?

0 投票
1 回答
943 浏览

python-3.x - importlib:如何在不关心模块名称的情况下导入多个 Python 文件

我想使用 CPython C API 将 Python 文件作为插件从 C 应用程序加载。这些 Python 文件包含类和其他东西,一旦我有了模块对象,我就知道如何获取它们。

我必须导入 Python 文件并获取模块对象的当前解决方案是这样的(Python 3):

我可以用 C API 做同样的事情。

我的理解是模块对象也被添加到sys.modules带有 key 的字典中some_module

我的问题是,如果我加载第二个模块,也指定some_module为模块名称,则在第二个模块中找到的名称将附加到与第一个模块相同的加载模块中,并且现有名称将被覆盖!也就是说,在这种情况下:

module并且module2实际上是同一个对象。就我而言,这很糟糕,因为两个插件可以(并且将)具有相同的全局名称。

请注意,我的应用程序的用户可以指定加载插件文件的路径列表,因此 Python 文件可以位于不同的位置,这也意味着两个不同的插件可以具有相同的基本名称。

知道这一点,我唯一的选择是从路径中创建一个唯一的模块名称吗?那么最后一个例子就变成了:

导入时有什么方法可以关心实际的模块名称吗?

0 投票
5 回答
12987 浏览

python - 如何即时修改导入的源代码?

假设我有一个这样的模块文件:

然后我有一个简单的脚本:

这将打印"hello".

假设我想“覆盖”该print()函数,以便它返回"world"。我如何以编程方式执行此操作(无需手动修改my_module.py)?


我的想法是我需要以某种方式my_module在导入之前或同时修改源代码。Obvisouly,导入它后我无法执行此操作,因此unittest.mock无法使用解决方案。

我还认为我可以读取文件my_module.py,执行修改,然后加载它。但这很难看,因为如果模块位于其他地方,它将无法工作。

我认为,好的解决方案是使用importlib.

我阅读了文档,发现了一个非常交叉的方法:get_source(fullname). 我以为我可以覆盖它:

不幸的是,我对所有这些抽象类有点迷茫,我不知道如何正确执行。

我徒劳地尝试:

请提供任何帮助。

0 投票
5 回答
12208 浏览

python - Python 3.5+:如何在给定完整文件路径的情况下动态导入模块(在存在隐式同级导入的情况下)?

问题

标准库清楚地记录了如何直接导入源文件(给定源文件的绝对文件路径),但如果该源文件使用隐式同级导入,如下例所述,则此方法不起作用。

在存在隐式同级导入的情况下,该示例如何适应工作?

我已经检查了这个这个关于该主题的其他Stackoverflow 问题,但它们没有解决手动导入的文件中的隐式同级导入

设置/示例

这是一个说明性示例

目录结构:


app.py


lib.py


implicit_sibling_import.py


在 Python 3.6 中运行注释掉python folder/implicit_sibling_import.py的块会产生收益。if __name__ == '__main__':ISI says: world

但是运行python directory/app.py会产生:

解决方法

如果我添加import sys; sys.path.insert(0, os.path.dirname(isi_path))app.py,按预期python app.py产生world,但我想尽可能避免修改sys.path

回答要求

我想python app.py打印ISI says: world,我想通过修改path_import函数来完成这个。

我不确定 mangling 的含义sys.path。例如。如果directory/requests.py并且我添加directory了. _ _sys.pathimport requestsdirectory/requests.pypip install requests

解决方案必须实现为接受所需模块的绝对文件路径并返回模块对象的 python 函数。

理想情况下,解决方案不应该引入副作用(例如,如果它确实修改sys.path了,它应该返回sys.path到它的原始状态)。如果解决方案确实引入了副作用,它应该解释为什么在不引入副作用的情况下无法实现解决方案。


PYTHONPATH

如果我有多个项目这样做,我不想PYTHONPATH每次在它们之间切换时都要记住设置。用户应该能够访问pip install我的项目并运行它而无需任何额外的设置。

-m

-m标志是推荐的/pythonic 方法,但标准库也清楚地记录了如何直接导入源文件。我想知道如何调整这种方法来应对隐式相对导入。显然,Python 的内部必须这样做,那么内部与“直接导入源文件”文档有何不同?

0 投票
5 回答
1957 浏览

python - 如何在运行时检查 python 模块是否有效而不导入它?

我有一个包含子包的包,其中只有一个我需要在运行时导入 - 但我需要测试它们是否有效。这是我的文件夹结构:

现在,在启动时运行的代码会:

但这有一个缺点,即所有的子包都被导入,导入了子包中的其他模块(例如 constants.py 等),这相当于几兆字节的垃圾。所以我想用子模块有效的测试来替换这段代码(它们可以很好地导入)。我想我应该以某种方式使用 eval - 但是如何?或者我该怎么办?

编辑: tldr;

我正在寻找与上面循环的核心等效的东西:

因此,如果存在与 vis 错误检查完全等效的 import 语句 -无需导入模块,我想要一个明确的答案。这是我的问题,很多回答者和评论者回答了不同的问题。

0 投票
2 回答
4174 浏览

python - 无法导入 importlib

我正在尝试使用 djangotoolbox.fields 中的 Listfield,但它给了我一个错误消息:

我究竟做错了什么?

0 投票
1 回答
2839 浏览

python - 在 IPython 中使用 importlib 重新加载模块

importlib对交互式 IPython shell 中的行为感到困惑。当我运行时:

我得到错误ImportError: No module named 'importlib.reload'。这正是我导入其他模块的方式,例如matplotlib.pyplot.

目前我一直只是importlib单独导入,然后使用importlib.reload(<module name>). 这不是一个主要问题,但为什么第一种方法不起作用?

0 投票
0 回答
335 浏览

python - 使用 py2exe 打包 selenium 时出错

我在 Anaconda 4.3 中使用 python 3.4 环境,并且正在尝试使用 py2exe 打包使用 selenium 的 python 脚本。该脚本作为 .py 文件完美运行,但 .exe 在尝试使用 import 语句从 selenium 模块导入 webdriver 时返回错误:

这是控制台中返回的回溯:

编辑将此表述为一个实际问题:当将文件作为 .py 脚本运行时,此导入语句可以正常工作。为什么只有在被 py2exe 打包后才会发生这种情况,并且在 py2exe 安装文件中是否缺少某种选项?