我跟着这个tutorial上传了一个包给PyPI。我的包现在上传到索引的测试实例: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解释器的site-packages,发现只有ilya_ezplots-0.0.2.dist-info
目录。对于其他包,将有两个目录,例如h5py-2.9.0.dist-info
和h5py
。
我的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
让我告诉你我之前的回答:https://stackoverflow.com/a/54599368/7976758
ilya_ezplots
是您的发行版的名称,但它不是可导入的名称。安装后的可导入名称是plots
。所以:
import plots
正如@phd回答的那样,你应该导入:import plots
。
或者您应该将目录结构更改为:
./ilya_ezplots/__init__.py
然后import ilya_ezplots
可以做到这一点。
导入的名称应与父目录匹配。
请参阅this帖子以保持正确的结构和良好实践。
好的做法是维护一些命名空间或与包名相同的目录名,这样用户就不会感到困惑。
如果您的项目名称是xyz
,那么您应该将目录名称保持为xyz
。因此,使用import xyz
可以导入您的包,不会与其他包混淆。例如。如果您使用yyy
作为您的目录名称(并且您的包名称是xyz
),那么用户可能会感到困惑并安装包yyy
。
一个真实的例子:
package beautifulsoup需要import bs4
来导入它,因此他们维护bs4
包(虚拟包),这样就没有人可以创建名为bs4
的包,因为这可能会成为安全风险。