Python - ModuleNotFoundError:没有命名的模块
Posted
技术标签:
【中文标题】Python - ModuleNotFoundError:没有命名的模块【英文标题】:Python - ModuleNotFoundError: No module named 【发布时间】:2020-08-15 08:15:27 【问题描述】:我是 Python 新手,在这个简单的示例中出现以下错误:
这是我的项目结构:
python_project
.
├── lib
│ ├── __init__.py
│ └── my_custom_lib.py
└── src
├── __init__.py
└── main.py
这是我执行src/main.py
文件时的错误:
☁ python_project python src/main.py
Traceback (most recent call last):
File "src/main.py", line 3, in <module>
from lib import my_custom_lib
ImportError: No module named lib
如果我将main.py
文件移动到根目录,然后我再次执行此文件,可以...但在src/
目录中不起作用
这是我的main.py
:
from lib import my_custom_lib
def do_something(message):
my_custom_lib.show(message)
do_something('Hello World!')
注意:当我从 Pycharm 执行相同的代码时工作正常,但不是从我的终端。
【问题讨论】:
请问为什么lib,即代码,在src之外?你说是自定义的,是项目之间共享的吗? 嗨@progmatico 在我的真实项目中我有/src
目录和同一级别的/tests
。问题是当我执行测试时,它试图从/src
导入代码。
如果你在 python_project 文件夹和每个子文件夹下放了一个空的__init__.py
,你应该可以从 project_folder 包内的任何地方导入。
如果您在项目之间有共享库,您可以使用 virtualenv 并在其中安装这些依赖项,或者将共享库与项目文件夹并排放置在文件夹中,并将文件夹附加到 sys.dll 中。包入口点内部的路径。
【参考方案1】:
您的PYTHONPATH 设置为您执行的程序的当前目录。因此,如果您在目录src
内执行某些操作,它将永远无法找到目录lib
,因为它位于路径之外。有几个选择;
lib/
属于您的代码,只需将其移至 src/
。如果是外部包,则应按照 Henrique Branco 所述进行 pip 安装。
在src/
之外有一个***脚本,用于导入和运行src.main
。这会将***目录添加到 python 路径。
在src/main.py
中修改sys.path
以包含***目录。这通常是不受欢迎的。
使用python -m src.main
将src/main.py
作为模块调用,这会将***目录添加到python 路径。打字有点烦人,而且您需要更改所有导入。
【讨论】:
嗨@MarkM,谢谢!我明白。也许我做错了,因为我基本上有一个带有my_project/src/
和my_project/tests/
目录的项目。当我执行测试时,问题就来了。有没有其他方法可以在 Python 中构建项目来避免这个问题?
无需重构您的项目,在您的源代码之外进行测试是一种很好的做法!如果src
和tests
都有__init__.py
,并且假设您正在编写传统的unittest.TestCase
测试,您可以利用标准的unittest 模块来discover 并使用简单的python -m unittest
从***目录。【参考方案2】:
如果我可以添加到MarkM's answer,如果您想保留当前的目录结构并使其继续工作,您可以在根目录中添加setup.py
,您可以在其中使用setuptools 创建一个包你可以安装。
如果您的文件包含以下内容:
# setup.py
from setuptools import find_packages, setup
setup(
name='foo',
version=`1.0.0`,
packages=find_packages(),
entrypoints=
'console_scripts': [
'foo=src.main:main',
],
,
)
然后您执行pip install [--user] -e path/to/directory
,您将获得一个“可编辑包”,它将有效地成为您开发目录中包的符号链接,因此您所做的任何更改都不需要重新安装(当然,除非您重新安装包结构或添加/删除/编辑入口点)。
这确实假设您的 src/main.py
有一个主要功能。
即使在 Python3 中,您的“包”目录中也需要 __init__.py
文件,否则 Python 会假定这些是命名空间包(不会详细说明)并且 find_packages()
调用不会找到它们.
这也将允许您的相对导入工作。绝对导入仅在从入口点调用脚本时有效,但在直接在开发目录中调用脚本时无效。
【讨论】:
【参考方案3】:你的 main.py 脚本应该在你的目录结构中的所有 python 包之上。尝试将您的项目更新为以下结构:
.
|__ main.py
|__ lib
| |__ __init__.py
| |__ your_custom_lib.py
|__ another_python_package
|__ __init__.py
|__ another_python_scripts
之后,您的项目目录中的python main.py
将起作用。
【讨论】:
【参考方案4】:您错误地使用了from a import b
。它应该是这样的:
import lib.my_custom_lib
另一种方法用于从模块中导入某些方法、函数和类,而不是模块本身。要从 my_custom_lib 模块导入特定函数,它看起来像这样:
from lib.my_custom_lib import foo
【讨论】:
在 main.py 中,我将“from lib import my_custom_lib”更改为“import lib.my_custom_lib”,但我仍然遇到同样的错误:“ModuleNotFoundError: No module named 'lib'”跨度> 确保在您的代码中将函数引用为lib.my_custom_lib.show(message)
这是我现在的代码,但我有同样的问题:import lib.my_custom_lib def do_something(message): lib.my_custom_lib.show(message) do_something('Hello World!')
当我从 Pycharm 执行相同的代码时工作正常,但不是从我的终端。【参考方案5】:
尝试使用相对导入:
from ..lib import my_custom_lib
【讨论】:
ImportError: 尝试在没有已知父包的情况下进行相对导入 :( 尝试按照本教程进行操作,它可能会有所帮助napuzba.com/a/import-error-relative-no-parent【参考方案6】:在我的可视化代码中 第 1 行的实际错误
我没有导入 _typeshed 模块,但默认情况下它是他们的 如果您在第 1 行找到,请删除该模块
【讨论】:
请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。 这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker.以上是关于Python - ModuleNotFoundError:没有命名的模块的主要内容,如果未能解决你的问题,请参考以下文章