【问题标题】:Correct structure for __init__.py hierarchy in Python packagesPython 包中 __init__.py 层次结构的正确结构
【发布时间】:2018-02-13 06:45:37
【问题描述】:

所以我到处都看到了很多关于__init__.py 文件的答案,老实说,这一切都让我很困惑,我并没有真正理解,所以我希望有一些答案帮助/基本解释。

我有一个包设置如下:

top_package/
├── __init__.py
└── mid_package/
    ├── __init__.py
    ├── first_import.py
    └── bottom_package/
         ├── __init__.py
         └── second_import.py

所以我这里有一些问题......

如何在second_import.py 中导入first_import.py

接下来,如何在first_import.py中导入second_import.py

最后,如果我在整个层次结构之外有一个脚本,可以这样说:

docs/
├── scripts
|   └── test_script.py
└── top_package/

如何在test_script.py 中导入first_import.pysecond_import.py

我的 Python 版本是 3.4.5(64 位 Anaconda),我在 Windows 上运行,如果这有什么不同的话。

因此,解决了这些问题,我将提供一些关于我迄今为止尝试过的内容:

(1) 我用它的“级别”初始化了每个__init.py,比如在“顶部”__init__.py

import sys
sys.path.append("C:\Path\To\top_package")

(2) 我添加了一行 __all__ 以及该级别所有内容的数组,例如:

__all__ = ['mid_package']

(3) 然后我添加了相对导入,例如:

from .mid_package import first_import

或者:

from .. import first_import

(4) 然后我会尝试在second_import.py这样的文件中正常加载这些文件:

import first_import

(5) 接下来,在test_script.py,我会尝试加载为:

import sys
sys.path.append('../top_package/')
import first_import

这将导致ImportError: No module named 'first_import'

我愿意接受任何和所有的想法,我已经为此工作了几个小时,但似乎无法破解它。非常感谢!

【问题讨论】:

  • 使用绝对导入。 from top_package.mid_package import first_importfrom top_package.mid_package.bottom_package import second_import
  • @Sraw 在__init__.py 文件中还是在外部文件中?
  • @Sraw 对外部文件执行此操作不起作用,无论是否将其放入 sys.path.append('../top_package/') (如果没有如上所述对当前 __init__.py 文件进行编辑。

标签: python python-3.x import init python-module


【解决方案1】:

嗯,这是一个关于 python 项目结构的老问题。但我认为关键问题是您当前的工作目录不是top_package。所以当你的解释器要搜索top_package时,就超出了范围。

这不是一个好习惯,您应该始终使用位于根目录中的脚本来启动您的项目。一个构建良好的python项目应该像下面的例子:

project
----src
--------app.py
--------modules
------------__init__.py
------------module.py
----test
--------test_cases.py
----doc
--------document.md
----.gitignore
----license.txt
----readme.md

并且您应该始终通过python src/app.py 启动您的项目,然后您才能正确使用absolute import

请注意,这只是一个非常基本的示例。

【讨论】:

  • 呃不,总是使用python -msetup.py-生成的脚本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 2015-05-14
  • 2013-11-21
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多