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.mainsrc/main.py 作为模块调用,这会将***目录添加到python 路径。打字有点烦人,而且您需要更改所有导入。

【讨论】:

嗨@MarkM,谢谢!我明白。也许我做错了,因为我基本上有一个带有my_project/src/my_project/tests/ 目录的项目。当我执行测试时,问题就来了。有没有其他方法可以在 Python 中构建项目来避免这个问题? 无需重构您的项目,在您的源代码之外进行测试是一种很好的做法!如果srctests 都有__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:没有命名的模块的主要内容,如果未能解决你的问题,请参考以下文章

001--python全栈--基础知识--python安装

Python代写,Python作业代写,代写Python,代做Python

Python开发

Python,python,python

Python 介绍

Python学习之认识python