【问题标题】:Unable to create a Python package for pip无法为 pip 创建 Python 包
【发布时间】:2019-03-26 09:24:21
【问题描述】:

我未能成功创建 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

我得到一个“成功安装”,但是当我调用 python 并执行 import first 时,我得到 ModuleNotFoundError"No module 'first'"。

请让我知道我做错了什么。说明很简单。

【问题讨论】:

  • 请出示您的完整设置脚本。看起来first 包没有捆绑。另外,运行 pip show -f first 并验证所有文件都已列出。
  • @hoefling 'pip show -f first' 什么都不做。因为我之前已经完成了“pip install tiwne”,所以当我检查“pip -f show twine”时,我得到了所有文件的列表 - .py、.pyc、LICENSE 等。是的,看起来我在 ' 中缺少一些步骤捆绑'包

标签: python pip setuptools pypi


【解决方案1】:

您应该在 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 包的来源。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-01-27
  • 2017-02-14
  • 2012-02-23
  • 2020-01-26
  • 1970-01-01
  • 2020-09-10
  • 2016-12-08
相关资源
最近更新 更多