自定义 python 包在导入时给出 ModuleNotFoundError

时间:2021-06-18 12:04:52

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

以下是我的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=[]
    )

2 个答案:

答案 0 :(得分:1)

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

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 - 在源代码管理中包含所有内容

希望通过这个,你将能够实现你想要的。

答案 1 :(得分:1)

查看导入语句的结构,您可能需要一个包含所有子包的附加文件夹:

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 解释器中,这样您就无需在每次代码更改后重新安装它(更新 {{ 后您仍然需要重新安装它) 1}} 不过)。