问题标签 [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 投票
2 回答
43 浏览

python - 如何使目录中的选定模块对 Python 可用?

假设我有一个包含 Python 模块和包的目录(在 Python 路径之外)。

如果我想让所有这些都可用于当前的 Python 解释器,我可以做sys.path.append(dir_name).

我怎样才能使这个目录中的选定模块或包对 Python 可用并隐藏其余的?

我考虑过创建一个单独的目录,其中包含指向这些选定模块的符号链接,但我不知道如何使其跨平台并且感觉不对。

我怀疑解决方案涉及importlib,但我希望得到更具体的指示。

0 投票
0 回答
30 浏览

python - 我们如何从文件系统层次结构中主脚本上方的目录中导入一些东西?

在里面file2.py我们有类似的东西:

我们可以用什么替换MAGICAL IMPORT STATEMENT,这样如果我们file2.py作为主脚本运行,我们就不会得到"ValueError: attempted relative import beyond top-level package"

0 投票
2 回答
11297 浏览

python-3.x - 在 python3 中使用 importlib 动态导入时出错

我一直在尝试importlib与 python3 (3.6) 一起使用。

目录结构

主文件

你好.py

文件夹/hello.py

观察

如果我做

hello = importlib.import_module('hello', package='./')或者

hello = importlib.import_module('hello')

它从根文件夹导入hello.pyhello world并打印.

如果我做

hello = importlib.import_module('folder.hello')

它从根文件夹导入文件夹/hello.pyhello world in folder并打印.

但如果我这样做

hello = importlib.import_module('hello', package='folder')或者

hello = importlib.import_module('hello', package='./folder')

它给出了错误

问题

我不确定这里发生了什么。我很确定我对 python 模块和包的理解有问题。有人可以解释为什么这是预期的行为吗?

0 投票
0 回答
376 浏览

python - 为什么使用 importlib 而不是 exec import

在 Python 中,如果您想动态导入模块(例如从字符串名称),您可以使用模块importlib和函数importlib.import_module("foo"),这基本上给出了相同的结果import foo(但它是动态的)。

无论如何,在我的程序中,我使用一个函数从列表中导入一个模块,所以它看起来像这样:

我在网络上的其他任何地方都没有看到过这种类型的解决方案。我要问的是,为什么?这是不好的做法,因为我正在使用该exec()功能(因为我已经读过无数次不要这样做)还是因为它只是更令人困惑

编辑:我觉得有必要注意这不是我上面的确切代码,而是与这个问题实际相关的部分,而不是让人们感到困惑

编辑(2):感谢用户 Aran-Fey 发现我的代码不起作用。我没有正确测试这个特定的片段。这是适用于 python 3.6 的版本:

0 投票
1 回答
2519 浏览

python - importlib.reload() 没有将文件重新加载到 ipython 笔记本中

我有一个在 Jupyter Lab 中运行的 ipython 笔记本。它正在运行一个函数,该函数使用我制作的名为“Myfile.py”的外部模块中的变量。

Myfile.py包括一些最初定义如下的变量:

我对Myterms列表进行了一些编辑Myfile.py,然后将更改保存到文件中。

我想要做的是将Myterms列表重新加载Myfile.py到笔记本中,这样当我调用列表中的变量时,它们会反映所做的更改。

我一直在使用此示例中的代码版本:

但是该行print(myterms)仍然打印出来

更新:出于某种原因,旧Myterms列表似乎在内存中徘徊并且尽管有importlib.reload功能并没有被覆盖。在做了更多研究之后,这个答案可能会提供一些关于原因的线索,但我找不到解决方法。

0 投票
1 回答
1821 浏览

python - 重新加载本地模块不起作用

首先,我知道这之前已经发布过,但是 A)建议不起作用或 B)建议是从命名空间中手动删除模块并像往常一样重新导入它。

我有以下模块结构

如果我在basedir, 并导入pytools并创建 class 的对象testcls。类的实际属性可在 中找到tools.pytestcls有一个名为的方法,它现在testfunc简单地打印出来:AAA

假设我testfunc()改为现在 print out BBB。我这样做,并保存文件。然后我重新加载模块并重试,它没有打印出来BBB

但是,如果我执行完全相同的过程,而是更改test.py,将该文件作为模块导入,在其中编辑一个函数,然后重新加载它,它的行为与预期的一样:

我真的不明白发生了什么,在这一点上真的很烦人。这也花费了我很多时间,但我现在更生气。

任何想法发生了什么?

版本:

蟒蛇:3.6.5

解释器:IPython,6.2.1

0 投票
1 回答
296 浏览

python - 如何在第一次导入时修补 Python 3 模块?

假设我想动态修补tkinter.Tk以使窗口保持在顶部。如果我确定以下代码确实使用了 Tkinter,那么我可以import tkinter在其余代码之前执行必要的更新。

但是如何设置模块按需修补,即。只有当其余代码真正导入模块时?

我知道sys.path_hooksand sys.meta_path,但我希望有更简单的东西。我不想更改查找或加载机制,我只想在将导入的模块对象传递给导入模块之前获取它。

我不需要支持早于 3.5 的 Python 版本。

0 投票
1 回答
94 浏览

python - 从另一个包中动态导入一个包

这是程序的结构:

我正在app.py尝试从 app.secure 内部动态导入处理程序,如下所示:

通过这样做,我希望处理程序被导入,但我收到以下错误:

在尝试使用__import__而不是像__import__('apps.secure.handler')我注意到它实际上导入了应用程序包之后。虽然from apps.secure import handler工作正常。我需要动态导入,因为程序需要能够在应用程序包中加载任何包。

有没有办法动态导入这个模块或者我必须使用exec

0 投票
0 回答
25 浏览

python-3.x - 将模块(.py 文件)导入另一个可访问变量的最佳方法?

我有一个简单的 .py 文件,其中包含一些变量和常量。在我的邮件文件中,我有引用这些变量的函数。我意识到我可以先运行带有输入的文件,但是有没有办法让它自动加载?我试过 importlib ,但没有执行它。这听起来可能很傻,但即使文件运行并且变量可见,我的编辑器(Spyder)仍然给我那些让我发疯的“未定义名称”标志。

0 投票
1 回答
2977 浏览

python - Python:使用 importlib 导入任意命名的源文件

给定绝对文件名,我使用该imp模块从源代码导入 Python 模块。IE

这里,/paht/to/my_module是包含 Python 源代码的文件的完整路径,即使它没有.py扩展名。

在 Python 3.7 中执行import imp时,会显示以下弃用警告:

DeprecationWarning:不推荐使用 imp 模块以支持 importlib;请参阅模块的文档以了解其他用途

因此,我正在寻找importlib该功能的替代品imp.load_source。从docs,我有以下内容:

当文件名没有扩展名时,这不起作用,就像我的情况一样。我猜它失败了,因为没有一个已实现的“查找器”将该文件识别为 Python 源文件。但是,我并不真正需要这些查找器提供的所有复杂机制,因为我已经确定文件的绝对路径。我只是想要它进口。

一个简单的技巧是将源作为文本读取并在其自己的命名空间中手动执行,例如

(有了这个,定义的名称my_module可以通过my_module['name']而不是my_module.name,但你明白了)。我想知道这样做的正确方法,使用importlib.