如何在Python中使用相对导入来导入另一个目录中的函数

w41d8nur  于 2023-01-12  发布在  Python
关注(0)|答案(3)|浏览(136)

我有一个目录结构与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()

有谁能帮我理解为什么会这样,以及如何纠正我的代码,以便我可以用相对导入来做到这一点?

xpcnnkqh

xpcnnkqh1#

一个Python目录必须包含一个__init__.py文件才能被认为是一个包。因为你的module2.py文件不在一个包含__init__.py文件的目录下,所以它不被认为是一个包的一部分。

h9vpoimq

h9vpoimq2#

默认情况下,Python只把一个包含代码的目录当作一个包含代码的目录,而不是一个包/子包,为了把它变成一个包,你需要给每个包添加一个__init__.py文件,同时在主目录package中添加一个__init__.py文件。

slmsl1lt

slmsl1lt3#

仅仅添加__init__.py文件是不够的,但是你应该这样做。你还应该在你的package目录下创建一个setup.py文件。你的文件树看起来像这样:

├── setup.py
└── package
    ├── __init__.py   
    └── subpackage1
    │   ├── __init__.py 
    │   └── module1.py
    └── subpackage2
        ├── __init__.py 
        └── module2.py

setup.py文件可以像这样开始:

from setuptools import setup

setup(
    name='package',
    packages=['package'],
)

这些配置足以让你开始。然后,在你的根目录下(packagesetup.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

相关问题