gpt4 book ai didi

python - 如何只导入包中没有 exec __init__.py 的子模块

转载 作者:太空狗 更新时间:2023-10-29 20:20:13 27 4
gpt4 key购买 nike

当从包中导入子模块时,包文件夹中的 __init__.py 文件将首先执行,我该如何禁用它。有时我只需要一个包中的一个功能,导入整个包有点重。

例如,pandas.io.clipboard 模块不依赖于 pandas 中的任何其他函数。

from pandas.io.clipboard import clipboard_get 将导入函数,但也会导入所有 pandas 公共(public)模块。是否有一些方法可以只导入剪贴板模块,因为它是我自己的应用程序文件夹中的一个模块。

最佳答案

没有,设计。如果你想在导入子模块时避免太多开销,你只需使用空的 __init__.pys 来定义包。通过这种方式,导入包的开销几乎为零。

如果 pandas 这样做,您没有方法可以在不导入的情况下导入 pandas.io.clipboard pandasio 首先。你可以做的是导入剪贴板模块作为普通模块而不是子模块。您只需找到安装 pandas 的位置(例如 /usr/lib/pythonX.Y/dist-packages/)并将父包的路径插入sys.path(在您的情况下为 /usr/lib/pythonX.Y/dist-packages/pandas/io)。然后你可以通过以下方式导入 clipboard 包:

import clipboard

但是请注意:

import clipboard
from pandas.io import clipboard as clipboard2
print(clipboard == clipboard2)

将打印False。事实上,这样做会破坏很多代码,因为您从根本上破坏了 import 机制假定的一些不变量。

特别是如果子模块确实使用相对导入引用其他子模块,导入将失败,并且在其他情况下它不会正确运行。另一个失败的例子是如果你必须处理腌制的对象。如果您使用导入为 pandas.io.clipboard 的模块腌制了一些对象,您将不能使用导入的模块 clipboard 取消腌制它们如上。

总而言之,不要!我建议:

  • 如果导入包所花费的时间不是真正的问题,请接受它。
  • 或者:尝试寻找替代者。如果你只需要 pandas.io.clipboard 但不需要其余的 pandas 也许你不应该首先使用 pandas 而你应该使用仅实现 clipboard 功能的较小包。

如果你看pandas.util.clipboard source code你发现它实际上只是 pyperclip模块版本 1.7。您只需将此模块添加到您的 site-packages 中,然后使用它来代替 pandas 提供的模块。事实上,pandas 团队只是在源代码末尾添加了以下部分:

## pandas aliases
clipboard_get = paste
clipboard_set = copy

扩展一下为什么 python 导入以这种方式工作。

如您所知,在 Python 中模块是对象。并且 包也是模块,虽然不是每个模块都是包。当你导入一个包时:

import pandas.io.clipboard

Python 必须:

  1. 创建模块实例pandas
  2. 创建 module 实例 io 并将其作为属性添加到 pandas
  3. 创建 module 实例 clipboard 并将其作为属性添加到 io

为了创建一个模块实例,python 必须执行模块中的代码

表单的导入:

from pandas.io import clipboard

只是语法糖:

import pandas.io.clipboard
clipboard = pandas.io.clipboard
del pandas.io

请注意,在 from 的情况下,clipboard 可以是 module/package 或只是在 io 中定义的内容>。为了对此进行检查,解释器必须还导入io,为此它必须还导入pandas

关于python - 如何只导入包中没有 exec __init__.py 的子模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21298833/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com