【问题标题】:Custom python packages gives ModuleNotFoundError while importing自定义 python 包在导入时会出现 ModuleNotFoundError
【发布时间】:2021-09-03 04:10:35
【问题描述】:

以下是我的python包结构

pkg
|-- src
    |-- data
        |-- __init__.py
        |-- loader1.py
    |-- dataset
        |-- __init__.py
        |-- loader2.py
    |-- utils
        |-- __init__.py
        |-- chk.py
|-- setup.py
|-- __init__.py
|-- LICENSE
|-- README.md

pip 安装后我想使用from pkg.data.loader1 import func,所以我使用了from pkg.data.loader1 import func(在 linux 终端中)。结果,我得到了ModuleNotFoundError: No module named 的回复。

我该如何解决这个问题。

编辑: setup.py

from setuptools import setup

with open("README.md", 'r') as fh:
    long_description = fh.read()

setup(
    name="pkg",
    version="0.0.1",
    description="will add",
    long_description=long_description,
    long_description_content_type="text/markdown",
    author="my name",
    packages=['pkg'],
    install_requires=[]
    )

【问题讨论】:

  • 你能把setup.py的内容包含在你的帖子里吗?
  • 为了确定,您确实在尝试导入之前运行了pip install -e .,对吧?
  • 使用pip3 install pkg.whl@Arne
  • 这些东西可能很难调试,所以我不会写答案。你能先试试 1) 在pkg 下直接添加一个空的__init__.py 文件,2) 也导入find_packages,然后在你的setup 调用更新packages=find_packages("pkg")

标签: python python-3.x package python-packaging


【解决方案1】:

你有package_dir={"": "pkg"}packages=find_packages("pkg")include_package_data=True 在你的setup() 方法。如果没有,那么我建议您像这样添加它-

setup(
    ....
    package_dir={"": "pkg"},
    packages=find_packages("pkg"),
    include_package_data=True,
    ....
)
  • package_dir={"": "pkg"} - 告诉 dsutil 包在 pkg

  • find_packages("pkg") - 包括 pkg

    下的所有包
  • include_package_data=True - 在源代码管理中包含所有内容

希望有了这个,你将能够实现你想要的。

【讨论】:

    【解决方案2】:

    查看导入语句的结构,您可能需要一个额外的文件夹来保存所有子包:

    pkg
    ├── src  # important: its only content is pkg
    │   └── pkg  # new folder here
    │       ├── __init__.py  # important: this file needs to exist
    │       ├── data
    │       │   ├── __init__.py
    │       │   └── loader1.py
    │       ├── dataset
    │       │   ├── __init__.py
    │       │   └── loader2.py
    │       └── utils
    │           ├── __init__.py
    │           └── chk.py
    ├── setup.py
    ├── __init__.py
    ├── LICENSE
    └── README.md
    

    接下来,您的setup.py 需要知道src 是代码源,而不是包根,它是它正下方的文件夹pkg,加上它的所有子包:

    setup(
        ....
        package_dir={"": "src"},
        packages=find_packages("pkg"),
        ....
    )
    

    然后您可以使用python -m pip install -e . 将此软件包安装到您当前活动的python 解释器中,这样您就不需要在每次代码更改后重新安装它(尽管您仍然需要在更新setup.py 后重新安装它)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 2019-07-03
      • 2021-05-10
      相关资源
      最近更新 更多