【问题标题】:import python module from another package从另一个包导入python模块
【发布时间】:2014-04-30 15:20:25
【问题描述】:

我有一个结构如下的脚本

./
    /foo
       __init__.py
    /bar
       __init__.py
    module.py

我想在 foo 和 bar 包上都使用 module.py,但我找不到导入它的方法!

我可以将模块放在两个包中,但如果我需要进行任何更改,我必须在两个包中都这样做。

【问题讨论】:

  • import module?如果module.py 的目录在路径上,那应该可以。如果它不在路径上,那么您也无法导入您的包。
  • 哪个文件是你的入口点?

标签: python import module package


【解决方案1】:

这实际上有点棘手,假设我们有这样的结构:

├── bar
│   ├── __init__.py
│   └── some_bar.py
├── foo
│   ├── __init__.py
│   └── some_foo.py
└── something.py

some_foo.py 中从something.py 获取对象的正确方法是添加:

# foo/some_foo.py
from something import some_module

然后将 some_foo 作为模块从顶级目录运行,使用 -m 选项,如下所示:

python -m foo.some_foo

添加一些打印语句到something.py 来测试它,如果一切顺利,你应该在运行 some_foo 后看到 something.py 的一些输出。请记住,您需要从顶层运行 some_foo,而不是从 foo 目录。

【讨论】:

  • 你为什么要把__init__.py放在一个可能是顶级模块something.py的旁边?在这种情况下,你为什么推荐import *?不要创建__init__.py 文件,也不要在此处使用import *
  • something.py 不是一个包。 from something import some_module 可能会产生误导(从技术上讲,您可以通过编程将 something.py 制作成一个包,但通常是作为目录创建的 Python 包(如foobar 在这种情况下)。
【解决方案2】:

如果import foo 有效,那么import module 也应该适用于您的情况。

如果您需要使用from toplevel import foo 来导入foo,那么您可以使用from toplevel import module 来导入module

【讨论】:

  • module.py: from foo import test foo\test.py: from . import module >python module.py - > ImportError: cannot import name module 除了 PYTHONPATH 魔法,没有办法使用from toplevel import module
  • 我同意顶级__init__.py 只需要包。
  • @AlexKroll:module.py 不在foo 内。为什么你认为from . import module 会起作用?请改用import module。不要在评论中添加信息,而是update your question
  • 这不是我的问题。但是您写道:如果您需要使用 from toplevel import foo 来导入 foo,那么您可以使用 from toplevel import module 到 import module。 现在我的相邻问题是:哪种方式指向 python 来导入 toplevel module 来自 foo\test.pyimport from 语法?
  • @AlexKroll: foo 在您的情况下是顶级的。这意味着你应该使用import module
【解决方案3】:

__init__.py 放在module.py 旁边。

更多信息http://docs.python.org/3/tutorial/modules.html?highlight=packages#packages

【讨论】:

  • 如果模块在任何包之外,则不需要__init__.py文件
猜你喜欢
  • 2021-01-15
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多