python文件无法作为模块被导入

文章讲述了在Python项目中遇到模块导入错误的问题,介绍了使用pyproject.toml进行包管理,包括如何编写、包的安装、查看依赖以及处理嵌套目录的方法。重点在于如何正确配置文件结构和依赖关系以确保模块能被正确导入。
摘要由CSDN通过智能技术生成

1、模块无法被导入

在项目tt下新建了文件夹tt包含模块文件a.py,里面包含t函数,在同路径下的1.py引入模块进行t函数的调用,具体如下

目录结构

/tt
  pyproject.toml
  /tt
    __init__.py
    /ttt
      __init__.py
      b.py
      ...

      ...
    a.py
    1.py
    ...

tt/tt/a.py

def t():
    print("run tt/a.py/t function")

tt/tt/1.py

from tt.a import t
t()

执行

python tt/1.py

报错ModuleNotFoundError

from tt.a import t
ModuleNotFoundError: No module named 'tt.tt'; 'tt' is not a package

2、python打包方式

2.1、pyproject.toml文件编写

pyproject.toml方式构建打包 ,本例子的pyproject.toml

[tool.poetry]
name = "tt"
version = "0.1.0"
description = "My project description"
authors = ["Your Name <you@example.com>"]
license = "MIT"

[tool.poetry.dependencies]
python = "^3.8"
requests = "^2.25.1"
# 更多依赖...

[tool.poetry.dev-dependencies]
pytest = "^6.2.4"
# 更多开发依赖...

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

2.2、包安装

执行

pip install -e .

可以输入python,进入到python环境,通过import tt,help(tt)查看安装包的具体情况。

退出python命令,执行

python tt/1.py

成功运行

3、pyproject.toml如何生成

3.1、手动编写pyproject.toml

模版

[tool.poetry]
name = "my_project"
version = "0.1.0"
description = "My project description"
authors = ["Your Name <you@example.com>"]
license = "MIT"

[tool.poetry.dependencies]
python = "^3.8"
requests = "^2.25.1"
# 更多依赖...

[tool.poetry.dev-dependencies]
pytest = "^6.2.4"
# 更多开发依赖...

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

在这个 pyproject.toml 文件中:

  • [tool.poetry] 部分包含你的项目的元数据,如名称、版本、描述、作者等信息。
  • [tool.poetry.dependencies] 部分列出了项目所需的第三方依赖。
  • [tool.poetry.dev-dependencies] 部分是开发时的依赖项,如测试框架。
  • [build-system] 部分指定了构建项目所需的最小要求,包括 poetry-core 和构建后端。

请注意,^ 符号是 poetry 版本标记,它意味着兼容的软件版本。在依赖版本中使用 ^ 表示你愿意接受在 major 版本不改变的前提下进行更新,这是遵循语义化版本控制。

3.2、通过poetry自动创建

3.2.1、poetry自动创建命令

poetry init

3.2.2、poetry安装及常见命令

pip install poetry
poetry install

# 查看包依赖
poetry show --tree

# 新增依赖
poetry add xxx

# 导出至 requirements.txt,用于线上服务部署
poetry export -f requirements.txt --output requirements.txt --without-hashes

4、pyproject.toml如何编写嵌套的目录

pyproject.toml 中执行嵌套目录的声明并不会直接在该文件中完成,而是通过相应的工具配置来管理多个包或模块的位置。pyproject.toml 文件本身主要用于指定包的元数据和构建依赖,并不直接处理包内文件和目录的布局。

在使用 poetry 管理项目时,如果你的项目结构具有嵌套目录,你通常需要在项目的 pyproject.toml 配置中指定如何发现和包含这些包。嵌套目录通常涉及到 source package(源包)和 subpackage(子包)的概念,poetry 将会根据项目文件夹结构自动识别并包含它们。

对于复杂项目,通常的做法是在项目根目录下有一个源代码目录(通常是项目名),而嵌套目录则作为子包存在。

例如,项目结构类似这样:

/my_project
  pyproject.toml
  /my_project
    __init__.py
    /subpackage1
      __init__.py
      ...

    /subpackage2
      __init__.py
      ...

    ...

在这种情况下,不需要在 pyproject.toml 中特别声明嵌套目录。只要每个子目录都包含 __init__.py 文件,poetry 就能正确地识别它们为子包。

如果有特殊的包含或排除规则需要指定,比如你想排除一些测试目录,或者有一些非标准的目录结构,那么你可以在 pyproject.toml[tool.poetry] 部分使用 includeexclude 参数来明确指定要包含和排除的文件和目录。

例如:

[tool.poetry]
name = "my_project"
# ... 省略其他元数据 ...

[tool.poetry.packages]
include = ["my_project", "my_project/subpackage1", "my_project/subpackage2"]

[tool.poetry.exclude]
exclude = ["tests", "**/*.tests.py", "**/*.test.py"]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值