python - 如何修复 ModuleNotFoundError?
问题描述
我已经阅读了一些 Python 相对与绝对导入教程,但我一生都无法弄清楚这个ModuleNotFound
错误。
我正在使用以下目录结构:
project
|
+-- pseudo
| |
| +-- __main__.py
| |
| +-- pseudo.py
| |
| +-- analytics_generator
| |
| +-- analytics_generator.py
| |
| +-- models
| |
| +-- blueprint.py
问题的根源是在analytics_generator.py 文件中,我试图从blueprint.py 导入SomeClass。
当我在 中执行 main 函数时__main__.py
,出现以下错误:
Traceback (most recent call last):
File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1741, in <module>
main()
File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1735, in main
globals = debugger.run(setup['file'], None, None, is_module)
File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1135, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "/Applications/PyCharm CE.app/Contents/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File ".../project/pseudo/__main__.py", line 2, in <module>
from pseudo import Pseudo
File ".../project/pseudo/pseudo.py", line 4, in <module>
from analytics_generator.analytics_generator import AnalyticsGenerator
File ".../project/pseudo/analytics_generator/analytics_generator.py", line 1, in <module>
from models.blueprints import SomeClass
ModuleNotFoundError: No module named 'models'
我在 Pycharm 中运行脚本,我的工作目录是.../project/pseudo
在 analytics_generator.py 文件中,如果我将导入语句更改为相对导入,它可以工作:from .models.blueprints import SomeClass
.
但是,使用完整路径不会:
from pseudo.analytics_generator.models.blueprints import SomeClass
抛出:
ModuleNotFoundError: No module named 'pseudo.analytics_generator'; 'pseudo' is not a package
非常感谢任何指导!
解决方案
不需要指定执行脚本的目录。由于您正在执行__main__.py
,因此应该执行以下操作:
from analytics_generator.models.blueprint import SomeClass
来源/进一步阅读:Python 导入语句的权威指南:绝对与相对导入
示例目录结构
test/ # root folder packA/ # package packA subA/ # subpackage subA __init__.py sa1.py sa2.py __init__.py a1.py a2.py packB/ # package packB (implicit namespace package) b1.py b2.py math.py random.py other.py start.py
例如,假设我们正在运行
start.py
which importsa1
which 依次导入other
,a2
和sa1
. 然后导入语句a1.py
如下所示:
绝对进口:
import other import packA.a2 import packA.subA.sa1
请注意,不需要指定import test.other
或import test.packA.test.other
(执行test
脚本的目录在哪里start.py
)。考虑到您使用的是 Python 3.3 及更高版本,相同的原则应该适用于您的情况,无论是否__init__.py
。
为了后代和完整性,我将引用指南的另一部分:
[...] 当 Python 运行脚本时,其包含的文件夹不被视为包。
这解释了'pseudo' is not a package
错误。
推荐阅读
- mysql - 如何将数据表列名称和值重命名为从 infyom laravel 生成器生成的岛名称?
- c++ - CUDA 的性能取决于声明变量
- php - 如何在不刷新页面的情况下将文本和图像文件数据同时发送到 MySQL 数据库
- python-2.7 - 让谷歌计算引擎实例以 64 位运行 Python 2.7.xx?
- c# - 关于扩展方法的困惑
- laravel - 仅在 laravel 中查询 created_at 日期仅等于 carbon::now() 日期
- python - Tkinter 类和按钮使用
- node.js - Waterfall prompt using activity.text instead of actually prompting user
- graphics - 从输入附件读取并在同一个drawcall中写入同一个附件是否可以?
- ios - 本地原生模块不能为空