PyPI - 包不包含任何文件

PyPI - package contains no files

我已经关注了这个tutorial to upload a package to PyPI. My package is now uploaded to test instance of the index: https://test.pypi.org/project/ilya-ezplots/#files。但是当我用pip安装它时,我仍然无法导入它。

>>> import ilya_ezplots
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'ilya_ezplots'

我检查了我的 python 解释器的站点包,发现只有 ilya_ezplots-0.0.2.dist-info 目录。对于其他包,将有两个目录,例如h5py-2.9.0.dist-infoh5py.

我的setup.py:

import setuptools

setuptools.setup(
    name="ilya_ezplots",
    version="0.0.2",
    packages=['plots'],
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
)

上传脚本:

#!/usr/bin/env bash

rm -r dist
python setup.py sdist bdist_wheel
python -m twine upload -r testpypi dist/* -u ikamensh

文件结构:

./
./plots/__init__.py
./setup.py
./upload.sh

让我向您指出我之前的回答:

ilya_ezplots 是您的发行版名称,但它不是可导入的名称。安装后可导入的名称为plots。所以:

import plots

正如@phd 回答的那样,您应该导入:import plots.

或者您应该将目录结构更改为:

./ilya_ezplots/__init__.py

然后 import ilya_ezplots 就可以了。

导入的名称应与父目录匹配。

参考 this post 以保持正确的结构和良好做法。

最好的做法是保留一些命名空间或与您的包名称相同的目录名称,这样用户就不会感到困惑。

如果您的项目名称是 xyz,那么您应该将目录名称保持为 xyz。因此,使用可以 import xyz 导入您的包,不会与其他包混淆。例如。如果您使用 yyy 作为您的目录名称(并且您的包名称是 xyz),那么用户可能会感到困惑并安装包 yyy

一个现实生活中的例子:

包 beautifulsoup 需要 import bs4 导入它,因此他们维护 bs4 包(虚拟包)以便没有人可以创建名称为 bs4 的包因为这可能会成为安全风险。