绝对导入导致模块未找到错误

9

Python 3.6

我编写了一些组件,现在正在尝试在其中一个组件中导入另一个组件。

下面是我的项目结构:

.
└── components
    ├── __init__.py
    ├── extract
    │   └── python3
    |       ├── __init__.py
    │       └── extract.py
    └── transform
        └── python3
            ├── __init__.py
            └── preprocess.py

extract.py

from components.transform.python3.preprocess import my_function

if __name__ == '__main__':
    my_function()

preprocess.py

def my_function():
    print("Found me")

当我运行 python components/extract/python3/extract.py 命令时,出现以下错误:

ModuleNotFoundError: 找不到名为 'components' 的模块

我已在包含模块的目录以及顶层包目录中添加了一个空的 __init__.py 文件。


2
目前不清楚您尝试了什么,以及“没有成功”的含义是什么,但据我所见,问题确实在于缺少任何__init__.py文件。Python认为components是一个模块(即.py文件),而您显然希望将其视为包(可以使用“.”符号访问其中的模块)-为此,它需要包含一个__init__.py文件。 - Robin Zigmond
@RobinZigmond 我已经将 __init__.py 文件添加到包含模块的目录和顶层目录中。 - Jonathan Porter
当你运行 python components/extract/python3/extract.py 时,你在哪个目录下?是 "." 吗? - Alasdair
好的,感谢您更新问题。我现在看到的主要问题是transformextract目录仍然缺少__init__.py文件,因此我预计现在的错误应该是“没有名为'transform'的模块。”您现在得到的确切错误文本是什么? - Robin Zigmond
@Alasdair 我是从项目目录的根目录运行它的。因此,我们在一个名为etl_pipeline的文件夹中,并且components文件夹在其中。 - Jonathan Porter
显示剩余2条评论
1个回答

12

好的,Python中导入需要顶级包在Python PATH(sys.path)中可用。

因此,为使其工作,您应该:

  • 进入包含components的目录
  • . 添加到Python PATH中:

  • export PYTHONPATH='.'
    
  • 启动你的脚本:

    python components/extract/python3/extract.py
    

在我的系统上,它可以成功显示:

Found me

这是一个永久性的解决方案吗?在本地运行时它可以工作,但如果在服务器上运行自动化流程,我是否需要做同样的事情? - Jonathan Porter
@JonathanPorter:对于自动化流程,正确的方法是将包含组件的目录永久地放置在Python路径中(服务器端)。 - Serge Ballesta
谢谢。export PYTHONPATH='.' 解决了我的问题。 - Will

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接