从python中的父文件夹导入

时间:2021-03-10 13:58:09

标签: python

我读过一些帖子,有人为此苦苦挣扎,花了几个小时尝试各种方法,但没有任何效果。

非常非常简单,我只想从父文件夹导入代码。项目的父根文件夹有一个空的 init.py 文件

结构是

__init__.py
services/
services/service_factory.py
etl/
etl/main.py

在 etl 文件夹中我正在运行 python main.py

这是我的 main.py,我已经尽可能简单:

import sys, os
sys.path.append(os.path.abspath(os.path.join('..', 'services')))
from services.services_factory import *
print('hello world')

我收到'ModuleNotFoundError:没有名为'services'的模块 谁能解释一下要更改什么才能使其正常工作?

2 个答案:

答案 0 :(得分:1)

这总是很令人困惑。相对导入是相对于模块结构的。要测试相对导入,您需要在主文件中(从模块外部)导入您的模块。让我尝试展示一个有效的案例:

$ python test_module.py
Hello World!

或者您可以将其设为可执行模块并使用 python -m 运行它(始终从模块外部)

$ python -m module.etl
Hello World!

结构

test_module.py
module
├── __init__.py [can be empty]
├── etl
   ├── __init__.py
   ├── __main__.py
│── services
   ├── service_factory.py

test_module.py

from module.etl import message
print(message)

service_factory.py

phrase = "Hello World"
mark = '!'

etl/__init__.py

from .__main__ import message

etl/__main__.py

from .. services.service_factory import phrase,mark

message = phrase+mark

if __name__ == "__main__":
    #this block is run when executing `python -m module.etl`

    print(message)

注意:如果您在 etl 中添加另一个文件,例如 etl/myscript.py,您仍然可以使用 python -m module.etl.myscript(始终从模块外部)执行它

答案 1 :(得分:0)

尝试将其作为模块运行,您的 cwd 应该比 main.py 高一级。

python -m etl.main