我读过一些帖子,有人为此苦苦挣扎,花了几个小时尝试各种方法,但没有任何效果。
非常非常简单,我只想从父文件夹导入代码。项目的父根文件夹有一个空的 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'的模块 谁能解释一下要更改什么才能使其正常工作?
答案 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