我有一个目录结构与2个基本的python文件在单独的目录:
├── package
│ ├── subpackage1
│ │ └── module1.py
└── subpackage2
└── module2.py
module1.py:
def module1():
print('hello world')
module2.py:
from ..subpackage1.module1 import module1
module1()
当运行python3 module2.py
时,我得到错误:ImportError: attempted relative import with no known parent package
但是,当我运行它时,导入更改为使用sys.path.append()
,它成功运行
import sys
sys.path.append('../subpackage1/')
from module1 import module1
module1()
有谁能帮我理解为什么会这样,以及如何纠正我的代码,以便我可以用相对导入来做到这一点?
3条答案
按热度按时间xpcnnkqh1#
一个Python目录必须包含一个
__init__.py
文件才能被认为是一个包。因为你的module2.py
文件不在一个包含__init__.py
文件的目录下,所以它不被认为是一个包的一部分。h9vpoimq2#
默认情况下,Python只把一个包含代码的目录当作一个包含代码的目录,而不是一个包/子包,为了把它变成一个包,你需要给每个包添加一个
__init__.py
文件,同时在主目录package
中添加一个__init__.py
文件。slmsl1lt3#
仅仅添加
__init__.py
文件是不够的,但是你应该这样做。你还应该在你的package
目录下创建一个setup.py
文件。你的文件树看起来像这样:此
setup.py
文件可以像这样开始:这些配置足以让你开始。然后,在你的根目录下(
package
和setup.py
的父文件夹),您将在您的终端pip install -e .
中执行下一个命令,以安装您的软件包,名为package,然后,您将能够导航到package/subpackage 2/并执行python module2.py
,得到预期的结果。您甚至可以执行python package/subpackage2/module2.py
,并且它可以工作。问题是,模块和包的工作方式与其他编程语言不同。如果不创建
setup.py
,如果你要在根目录下创建一个程序,例如名为main.py
,那么你可以从package文件夹树中导入模块。但如果你要执行package\subpackage2\module2.py。