无法为 pip 创建 Python 包

Unable to create a Python package for pip

我未能成功创建 Python 包分发。我已按照 https://packaging.python.org/tutorials/packaging-projects/ 中的说明进行操作,结果就是这样。例如如果我根据需要创建必要的文件和文件夹

first/
   first/
     __init__.py
     setup.py
     LICENSE
     README.md
     myfirst.py

我在setup.py

中将包名设为'first'
import setuptools

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

    setuptools.setup(
        name="tvg11",
        version="0.0.1",
        author="Ganesh",
        author_email="tvganesh.85@gmail.com",
        description="A small example package",
        long_description=long_description,
        long_description_content_type="text/markdown",
        url="https://github.com/pypa/sampleproject",
        packages=setuptools.find_packages(),
        classifiers=[
            "Programming Language :: Python :: 3",
            "License :: OSI Approved :: MIT License",
            "Operating System :: OS Independent",
        ],
    )

然后我运行命令

python setup.py sdist bdist_wheel
python -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*

创建 dist/build/first.egg-info

现在我发现如果我在同一目录中并执行

pip install --index-url https://test.pypi.org/simple/ first

然后我发现这会用编译后的代码创建一个新文件夹 pycache,我可以做到 import first

first/
  first/
    __pycache__     # new!
    build/
    dist/
    first.egg.info
    __init__.py
    setup.py
    LICENSE
    README.md
    myfirst.py

但是,如果我在根文件夹 'first/first' 以外的任何其他文件夹中,并且我执行

pip install --index-url https://test.pypi.org/simple/ first

我得到一个 'Successfully installed' 但是当我调用 python 并执行 import first 我得到 ModuleNotFoundError "No module 'first'".

请让我知道我做错了什么。说明是如此简单。

您应该在 test.pypi.org 中交互式查看...

您会立即注意到您自己的项目不是 first,而是 tvg11。重要的是 setup.py 文件中的名称和版本号,而不是文件夹名称。

但真正的原因是你把包里的文件和setup.py文件放在同一层,用了packages=setuptools.find_packages()。因此,由于您没有低于 setup.py 的包,find_packages 什么也找不到,并且您已经构建了有趣的包,只包含 setup.pyREADME.md.

如何修复:

首先你应该为你的包构建一个更通用的结构:

  - first
    - setup.py
    - LICENSE
    - README.md

    - first
        - __init__.py
        - myfirst.py

这样 find_package 将找到 first 子文件夹的内容作为 tvg11 包的源。