Python - 使用 __init__.py 导入具有依赖项的子模块的正确方法

问题描述 投票:0回答:1

我试图使用

module_1
文件将一些功能(
module_2
MyProject
,...)打包到一个大包(
__init__.py
)中。问题是,我无法使用具有依赖项的函数(从同一文件夹内的其他 python 脚本导入的函数)。 这是我的目录结构的示例:

+MyProject
|-__init__.py
|-run_everything.py
|
|-+ module_1
| |-__init__.py
| |-run_module.py
| |-script_1.py
| |-script_2.py
|
|-+ module_2
| |-....
|
|-+ module_3
| |-....

run_module.py
仅导入同一目录/模块中
script_1.py
script_2.py
中的函数。

只要我分别从每个

run_module.py
运行
module_1, 2,...
,它们就可以正常工作。但是,如果我尝试将“run_module”导入到
run_everything.py
中,我将从子模块内导入的模块中获得
ModuleNotFoundError

我已经查看了堆栈(而且不仅仅是),据我了解,我应该使用以下方法之一,但在我的情况下不起作用:

1.

__init__.py
里面
module_1
:

import script_1
import script_2

内部进口

run_everything.py

import module_1
import module_2
...

我得到:

import script_1.py
ModuleNotFoundError: No module named 'script_1.py'

据我了解,显式导入 module_1 中

__init__.py
内的所有脚本应该使它们可用,那么为什么会出现错误?

2. 如果我使用干净的

__init__.py
文件,但在我的
run_everything.py
文件中添加点符号,也会发生同样的错误:

import module_1.script_1
import module_1.script_2
...

我知道这还应该导入 script_1、script_2... 中导入的所有内容?

3. 我也尝试使用:

from module_1.run_module import function()

有同样的错误,但由于它依赖于其他函数,这并不奇怪。


我想要实现的是使用

run_module.py
中的函数start(),如下所示:

import module_1
...
module_1.run_module.start()

此功能正在使用同一文件夹内

script_1
script_2
中的其他功能。

我知道我可以通过操作系统路径进行导入,但由于

__init__.py
存在,我想使用它。

python python-3.x python-import importerror
1个回答
0
投票

您需要将 script_1 和 script_2 中的函数导入到

run_module.py
,并用点

示例

# run_module.py

from .script_1 import func1
from .script_2 import func2


def start ():
    func1()
    func2()

然后在

__init__.py
里面
module_1

from .run_module import start

终于到了

run_everything.py

from module_1 import start

start()

并且:

python3 run_everything.py
© www.soinside.com 2019 - 2024. All rights reserved.