网站首页 > 技术文章 正文
技术背景
在Python开发中,经常需要安装和管理各种包和模块。setup.py文件是Python的一个重要工具,它是使用Distutils(Python标准库中用于分发Python模块的工具)打包和分发Python模块的标志。通过setup.py,可以方便地安装、打包和发布Python包,实现包的自动化管理。
实现步骤
安装Python包
如果你下载的Python包的根目录下有setup.py文件,可以使用以下命令进行安装:
python setup.py install
不过,现在更推荐使用pip来安装,因为直接调用setup.py有一些潜在问题,使用pip安装时,它会自动使用setup.py来完成安装:
pip install .
创建Python包
如果要创建自己的Python包,需要编写setup.py文件。以下是不同复杂度的包对应的setup.py编写示例:
简单包结构
假设包结构如下:
foo
├── foo
│ ├── data_struct.py
│ ├── __init__.py
│ └── internals.py
├── README
├── requirements.txt
└── setup.py
对应的setup.py文件内容如下:
from setuptools import setup
setup(
name='foo',
version='1.0',
description='A useful module',
author='Man Foo',
author_email='[email protected]',
packages=['foo'], # 与包名相同
install_requires=['wheel', 'bar', 'greek'], # 外部依赖包
)
复杂包结构
当包结构更复杂,包含脚本文件时,例如:
foo
├── foo
│ ├── data_struct.py
│ ├── __init__.py
│ └── internals.py
├── README
├── requirements.txt
├── scripts
│ ├── cool
│ └── skype
└── setup.py
setup.py文件内容如下:
from setuptools import setup
setup(
name='foo',
version='1.0',
description='A useful module',
author='Man Foo',
author_email='[email protected]',
packages=['foo'], # 与包名相同
install_requires=['wheel', 'bar', 'greek'], # 外部依赖包
scripts=[
'scripts/cool',
'scripts/skype',
]
)
发布Python包到PyPI
如果要将包发布到PyPI供他人使用,可以按照以下步骤操作:
- 首先,在本地构建分发文件:
# 前提:安装wheel
pip install wheel
python setup.py sdist bdist_wheel
- 然后,使用twine上传到测试服务器test.pypi.org进行测试:
twine upload --repository testpypi dist/*
输入用户名和密码后,等待几分钟,包就会出现在test.pypi.org上。
- 若测试通过,将包上传到正式的pypi.org:
twine upload dist/*
还可以选择使用GPG对包中的文件进行签名:
twine upload dist/* --sign
核心代码
以下是一个较为完整的setup.py示例,包含读取README文件作为长描述:
from setuptools import setup
with open("README", 'r') as f:
long_description = f.read()
setup(
name='foo',
version='1.0',
description='A useful module',
license="MIT",
long_description=long_description,
author='Man Foo',
author_email='[email protected]',
url="http://www.foopackage.example/",
packages=['foo'], # 与包名相同
install_requires=['wheel', 'bar', 'greek'], # 外部依赖包
scripts=[
'scripts/cool',
'scripts/skype',
]
)
最佳实践
- 使用pip安装:避免直接调用setup.py进行安装,因为pip能更好地处理依赖和版本管理。
- 读取requirements.txt:可以解析requirements.txt文件并将其内容赋值给install_requires,使依赖管理更清晰。
with open('requirements.txt') as f:
requirements = f.read().splitlines()
setup(
# ...
install_requires=requirements,
# ...
)
- 使用setuptools:setuptools是Distutils的增强版本,提供了更多功能,如自动发现包和子包。
from setuptools import setup, find_packages
setup(
# ...
packages=find_packages(),
# ...
)
常见问题
1. 直接调用setup.py install有什么问题?
直接调用setup.py install可能会破坏版本管理,并且在某些情况下会导致安装混乱。而pip会处理依赖解析和版本控制,提供更稳定的安装环境。
2. 如何处理子包?
使用setuptools的find_packages()函数可以自动发现包和子包,无需手动列出每个子包。
3. setup.py是否必须命名为setup.py?
setup.py只是一个约定的名称,可以使用其他名称,但这样会使安装和使用的过程变得不统一,增加用户的使用成本。
4. 新的Python版本是否还需要setup.py?
较新的setuptools和pip版本可以省略setup.py,但目前setup.py仍然被广泛使用,并且在一些场景下还是必要的。
猜你喜欢
- 2025-05-11 Python包导入指南:从菜鸟到专家的import魔法
- 2025-05-11 一文学会用PyInstaller把Python 程序打包成一个独立的可执行文件
- 2025-05-11 如何在python中安装和配置kivy库
- 2025-05-11 Python程序员必看!10分钟搞定项目打包:PyInstaller保姆级教程
- 2025-05-11 Python程序开发入门(第六章)函数与模块
- 2025-05-11 Python保姆级安装教程(CPU+GPU)
- 2025-05-11 Python 中的函数和模块
- 2025-05-11 python 进阶突破——内置模块(Standard Library)
- 2025-05-11 Python中h5py与netCDF4模块在Anaconda环境的下载与安装
- 2025-05-11 ubuntu部署python脚本为系统服务
- 05-27程序员用 Python 爬取抖音高颜值美女
- 05-27YOLO v3、FaceNet和SVM的人脸检测识别系统源码(python)分享
- 05-27「工具推荐」世界上最简单的人脸识别库 44.7 star
- 05-27开源人脸识别系统源码推荐
- 05-27Go 人脸识别教程
- 05-27Python 深度学习之人脸识别(yolo+facenet)
- 05-27简单的Py人脸识别
- 05-27Python编程 - 基于OpenCV实现人脸识别(实践篇)爬虫+人脸识别
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 91℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 82℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)