如何仅导入子模块而不执行包中的 exec __init__.py

2024-04-05

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

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

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


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

If pandas does not做你有的事no导入方式pandas.io.clipboard无需导入pandas and io第一的。你什么can做,但是这是一个巨大的hack它是not等价的是导入clipboard模块作为普通模块而不是作为子模块。您只需找到所在的位置即可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机制假设。

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

总之,don't!我建议:

  • 如果导入包所花费的时间不是很长,请忍受它real issue.
  • 或者:尝试寻找替代品。如果你只需要pandas.io.clipboard但不是其余的pandas也许你不应该使用pandas首先,您应该使用仅实现以下功能的较小包clipboard.

如果你看pandas.util.clipboard源代码 https://github.com/pandas-dev/pandas/blob/master/pandas/io/clipboard/__init__.py你发现它实际上只是pyperclip https://github.com/asweigart/pyperclip模块版本 1.7。您只需将此模块添加到您的site-packages并使用它来代替提供的pandas。事实上pandas团队仅在源代码末尾添加了以下片段:

## pandas aliases
clipboard_get = paste
clipboard_set = copy

扩展一下关于whypython import 就是这样工作的。

正如你在Python中所知道的模块是对象。而且也有这样的情况包是模块,尽管并非每个模块都是包。当您导入包时,如下所示:

import pandas.io.clipboard

Python 必须:

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

为了创建一个module实例Python必须执行代码在模块中。

形式的导入:

from pandas.io import clipboard

只是语法糖:

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

请注意,在from case clipboard可以是module/package 或者只是内部定义的东西io。为了检查这一点,口译员must还导入io并做到这一点must还导入pandas.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何仅导入子模块而不执行包中的 exec __init__.py 的相关文章

  • 从另一个文件导入函数,在哪里导入其他库?

    很简单的问题 我搜了一下没有结果 假设我有一个文件 funcs py 其中有一个我想调用当前脚本的函数 该函数使用另一个库 例如 pandas 我在哪里导入该库 约定是什么 我是否将它放在 funcs py 的函数内 funcs py de
  • Python 3D 插值加速

    我有以下用于插入 3D 体积数据的代码 Y X Z np shape volume xs np arange 0 X ys np arange 0 Y zs np arange 0 Z points list zip np ravel re
  • 计算 scikit-learn 逻辑回归模型的残差偏差

    有没有办法计算残差scikit learn 逻辑回归模型 http scikit learn org stable modules generated sklearn linear model LogisticRegression html
  • 如何在 Matplotlib 中指定类似箭头的线条样式?

    我想在 Matplotlib 中显示一组 xy 数据 以指示特定路径 理想情况下 将修改线条样式以使用类似箭头的补丁 我创建了一个模型 如下所示 使用 Omnigraphsketcher 看来我应该能够覆盖常见的之一linestyle声明
  • 调试:获取调用函数的文件名和行号?

    我目前正在用 Python 构建一个相当复杂的系统 当我调试时 我经常在几个脚本中放入简单的打印语句 为了保持概览 我经常还想打印出打印语句所在的文件名和行号 我当然可以手动执行此操作 或者使用类似这样的操作 from inspect im
  • tf.print 什么时候才能真正按预期工作(即打印张量和变量的值)?

    首先 我使用的是TensorFlow 2 0 我只关心这个版本或更高版本 而且我已经太关心这样一个只会产生头痛的软件了 The TensorFlow 文档 https www tensorflow org api docs python t
  • 有没有办法在 ggplot 中绘制 pandas 系列?

    我正在尝试 pandas 和非 matplotlib 绘图 好的建议是here http pandas pydata org pandas docs stable ecosystem html 这个问题涉及到yhat 的 ggplot ht
  • 在QT中以不同的时间间隔更新GUI [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道如何在QT中以不同的时间间隔更新GUI 最好的是我可以控制时间间隔 我知道 QTimer 可以在同一时间间隔更新 GUI 但我
  • Python 中的字符串、整数和运算符

    如何在运算中使用算术运算符 由用户作为字符串输入 我可以打印操作本身 但我想打印解决方案 这是我的笨拙尝试 Initialise variables x 2 y 3 Prompt the user for an arithmetic ope
  • 如何在屏幕上锚定 Tkinter 窗口(不可移动窗口)

    我正在尝试在特定位置打开 tkinter 如果它是不可移动的 那就更好了 我搜索文档和其他内容 但没有找到任何相关内容 最好的方法是将顶部或底部固定在一个位置 x y 如果需要 我可以调整窗口大小 def my functions prin
  • 匹配所有 utf-8/unicode 小写字母形式的正确正则表达式是什么

    我想匹配all拉丁语块中的小写字母形式 简单的 a z 仅匹配 U 0061 和 U 007A 之间的字符 而不匹配所有其他小写形式 我想匹配所有小写字母 最重要的是 EFIGS 语言中使用的拉丁语块中的所有带重音的小写字母 a z 是一个
  • “scipy.misc”没有属性“imsave”

    当我尝试使用 Scipy misc imsave path image 保存图像时 我收到此错误 模块 scipy misc 没有属性 我正在使用 Ubuntu 17 10 并且安装了 Pillow 和 scipy 你能帮我吗 scipy
  • Python 模块导入对一个文件有效,对另一个文件则失败

    我面临着一个非常奇怪的问题 我有三个文件 第一个包含基类 其他两个文件中的类继承自该基类 奇怪的是 昨天一切都工作正常 但今天其中一个文件不再工作了 在此期间我还没有接触过进口 orangecontrib init py prototype
  • python 解码部分 utf-8 字节数组

    我从不了解 UTF 8 规则的通道获取数据 因此 有时当 UTF 8 使用多个字节来编码一个字符并且我尝试将部分接收到的数据转换为文本时 我在转换过程中遇到错误 根据接口的性质 没有任何结束的流 我无法找出数据何时已满 因此我需要处理部分
  • 使用 python 对 Robot Framework 中的测试套件中的每个测试用例进行测试设置和拆卸

    我是机器人框架的新手 有人可以帮我看看是否可以为包含大约 20 个测试用例的测试套件中的每个测试用例进行测试设置和拆卸 有人可以用例子解释一下吗 这是一个例子 包含拆解的测试套件 如果你想最后执行每个测试用例 你可以错过它的拆卸 请阅读相应
  • django 序列化器到 json - 自定义 json 输出格式

    我对 django 很陌生 最近我需要 JSON 输出 为此我使用以下 django 代码 data serializers serialize json Mymodel objects all 它工作得很好 除了我得到的输出 pk 897
  • 从查找文件中批量重命名部分文件名

    edit 请参阅底部以了解我的最终解决方案 我有一个包含约 12 700 个文本文件的目录 他们的名字是这样的 1 Re Report Novenator 公开呼吁埋葬 Lizbett 星期四 2009 年 9 月 10 日 txt 其中前
  • python 中的 stdin 和 sys.argv 有什么区别? [复制]

    这个问题在这里已经有答案了 我在一次编码挑战中被扣分 该挑战指定我需要从 STDIN 读取 这是我的输入法 def init self input self dictionary with open input r as f reader
  • 如何在 Pandas 的时间序列图上绘制垂直线?

    如何绘制垂直线 vlines 在熊猫系列情节中 我正在使用 Pandas 绘制滚动平均值等 并且想用垂直线标记重要位置 是否可以使用vlines或类似的东西来完成这个 在这种情况下 x 轴是datetime plt axvline x po
  • 从Python中的一行中删除标签

    我有一个具有以下架构的文本 word1 word2 br word3 word4 br 我想删除最后一部分 并将我的结果存储在另一个文件中 我已尝试以下操作 仍然没有将结果保存在其他文件中 def main fileR open test

随机推荐