【发布时间】: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.py 和second_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_import和from 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