无法为 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.py
和 README.md
.
如何修复:
首先你应该为你的包构建一个更通用的结构:
- first
- setup.py
- LICENSE
- README.md
- first
- __init__.py
- myfirst.py
这样 find_package
将找到 first
子文件夹的内容作为 tvg11
包的源。
我未能成功创建 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.py
和 README.md
.
如何修复:
首先你应该为你的包构建一个更通用的结构:
- first
- setup.py
- LICENSE
- README.md
- first
- __init__.py
- myfirst.py
这样 find_package
将找到 first
子文件夹的内容作为 tvg11
包的源。