告别setup.py,Python项目清理新方法
告别`setup.py`!本文针对采用`pyproject.toml`构建的现代Python项目,提供一套高效实用的清理构建文件指南,助力开发者维护整洁、可控的项目环境。随着`setup.py`的弃用,手动清理`__pycache__`、`.pyc`文件、`build`目录等临时构建产物成为必要。文章详细解析了常见构建产物的作用与清理原因,并提供Linux/macOS及Windows下的命令行清理方案。更进一步,介绍了利用`.gitignore`文件和自动化脚本(Python、Makefile)实现项目清理的最佳实践。掌握这些技巧,不仅能释放磁盘空间,更能避免旧构建缓存导致的潜在问题,确保项目始终在最佳状态下运行和构建,提升开发效率,优化用户体验。
背景:从setup.py到pyproject.toml
在Python项目的早期开发实践中,setup.py文件是项目配置和构建的核心。通过执行python setup.py clean --all命令,开发者可以方便地清除项目构建过程中产生的所有临时文件和目录。然而,随着Python生态系统的发展,PEP 517和PEP 518的引入推动了标准化构建后端(如build模块)和pyproject.toml文件的普及。现在,项目通常使用pyproject.toml来声明其构建系统依赖和元数据,并通过python -m build等命令进行构建。
这种转变带来了一个问题:对于不再包含setup.py文件的项目,传统的clean命令已不再适用。因此,理解并掌握手动或脚本化清理这些构建产物的方法,对于维护项目整洁和解决潜在的构建问题至关重要。
核心清理目标:常见的构建产物
在没有setup.py的情况下,构建工具(如build、setuptools等)或Python解释器本身在运行过程中会生成一系列临时文件和目录。这些是清理工作的核心目标:
__pycache__ 目录
- 作用: Python解释器为了提高模块加载速度而缓存编译后的字节码(.pyc文件)。
- 清理原因: 包含旧的或不必要的字节码,可能导致模块行为异常或占用空间。
*`.pyc` 文件**
- 作用: 编译后的Python字节码文件,通常存在于__pycache__目录中,但在某些情况下也可能直接存在于源代码目录。
- 清理原因: 同__pycache__,移除过时或冗余的字节码。
.swp 文件
- 作用: 某些文本编辑器(如Vim)在编辑文件时创建的交换文件,用于崩溃恢复。
- 清理原因: 属于临时文件,通常在编辑器正常退出后自动删除,但异常情况下可能残留。
build 目录
- 作用: 由构建工具(如setuptools、build)生成,包含编译后的C扩展、中间文件、以及打包前的临时构建内容。
- 清理原因: 存储了项目的中间构建状态,重新构建时应从干净状态开始。
dist 目录
- 作用: 包含最终分发的包文件,如.whl(wheel)和.tar.gz(source distribution)。
- 清理原因: 移除旧版本或不成功的构建包,确保发布的是最新且正确的版本。
*.egg-info 或 *.dist-info 目录
- 作用: 包含项目的元数据,由setuptools等工具生成。
- 清理原因: 有时在重新构建或更改项目元数据后,清理这些目录可以避免冲突。
测试缓存目录 (例如 .pytest_cache)
- 作用: 测试框架(如pytest)为了加速测试运行而缓存的信息。
- 清理原因: 移除旧的测试结果或缓存,确保测试环境的干净。
类型检查缓存目录 (例如 .mypy_cache)
- 作用: 类型检查工具(如mypy)缓存的类型信息。
- 清理原因: 在代码或配置更改后,清理缓存以强制重新检查。
实战清理方法
由于没有统一的clean命令,我们需要通过手动或脚本化的方式来删除这些文件和目录。
1. 手动删除
对于小型项目或不频繁的清理操作,可以直接通过文件管理器导航到项目目录,然后手动删除上述提到的文件和目录。
2. 命令行清理
这是最常用且高效的方法,适用于各种操作系统。
a. Linux / macOS (使用 find 和 rm)
在终端中,进入项目根目录,然后执行以下命令:
# 清理 __pycache__ 目录 find . -type d -name "__pycache__" -exec rm -rf {} + # 清理 *.pyc 文件 find . -type f -name "*.pyc" -delete # 清理 .swp 文件 find . -type f -name "*.swp" -delete # 清理 build 目录 rm -rf build # 清理 dist 目录 rm -rf dist # 清理 *.egg-info 或 *.dist-info 目录 find . -type d -name "*.egg-info" -exec rm -rf {} + find . -type d -name "*.dist-info" -exec rm -rf {} + # 清理测试和类型检查缓存 rm -rf .pytest_cache rm -rf .mypy_cache # 综合清理命令 (推荐在项目根目录执行) echo "Cleaning Python build artifacts..." find . -type d -name "__pycache__" -exec rm -rf {} + find . -type f -name "*.pyc" -delete find . -type f -name "*.swp" -delete rm -rf build dist .pytest_cache .mypy_cache find . -type d -name "*.egg-info" -exec rm -rf {} + find . -type d -name "*.dist-info" -exec rm -rf {} + echo "Cleaning complete."
b. Windows (使用 for /D 和 del)
在PowerShell或命令提示符中,进入项目根目录,然后执行以下命令:
# 清理 __pycache__ 目录 Get-ChildItem -Path . -Recurse -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -eq "__pycache__" } | Remove-Item -Recurse -Force # 清理 *.pyc 文件 Get-ChildItem -Path . -Recurse -Include *.pyc -ErrorAction SilentlyContinue | Remove-Item -Force # 清理 .swp 文件 Get-ChildItem -Path . -Recurse -Include *.swp -ErrorAction SilentlyContinue | Remove-Item -Force # 清理 build 目录 Remove-Item -Path "build" -Recurse -Force -ErrorAction SilentlyContinue # 清理 dist 目录 Remove-Item -Path "dist" -Recurse -Force -ErrorAction SilentlyContinue # 清理 *.egg-info 或 *.dist-info 目录 Get-ChildItem -Path . -Recurse -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -like "*.egg-info" -or $_.Name -like "*.dist-info" } | Remove-Item -Recurse -Force # 清理测试和类型检查缓存 Remove-Item -Path ".pytest_cache" -Recurse -Force -ErrorAction SilentlyContinue Remove-Item -Path ".mypy_cache" -Recurse -Force -ErrorAction SilentlyContinue # 综合清理命令 (推荐在项目根目录执行) Write-Host "Cleaning Python build artifacts..." Get-ChildItem -Path . -Recurse -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -eq "__pycache__" } | Remove-Item -Recurse -Force Get-ChildItem -Path . -Recurse -Include *.pyc, *.swp -ErrorAction SilentlyContinue | Remove-Item -Force Remove-Item -Path "build", "dist", ".pytest_cache", ".mypy_cache" -Recurse -Force -ErrorAction SilentlyContinue Get-ChildItem -Path . -Recurse -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -like "*.egg-info" -or $_.Name -like "*.dist-info" } | Remove-Item -Recurse -Force Write-Host "Cleaning complete."
3. 利用 .gitignore 文件
虽然.gitignore不能直接清理已存在的文件,但它能阻止这些临时文件被误提交到版本控制系统,从而保持仓库的整洁。在项目的.gitignore文件中添加以下条目:
# Byte-code files __pycache__/ *.pyc # Build artifacts build/ dist/ *.egg-info/ *.dist-info/ # Editor swap files *.swp # Testing and type checking caches .pytest_cache/ .mypy_cache/ # Other common temporary files .coverage .venv/ # If you manage virtual environment inside the project folder venv/
4. 自动化清理脚本或任务运行器
对于大型项目或团队协作,将清理命令封装成一个脚本或使用任务运行器(如Makefile、invoke、npm scripts)是一个更好的选择。
a. Python 清理脚本 (clean.py)
可以在项目根目录创建一个clean.py脚本:
import shutil import glob import os def clean_build_artifacts(): """Removes common Python build artifacts and temporary files.""" print("Cleaning Python build artifacts...") # Directories to remove dirs_to_remove = [ "build", "dist", "__pycache__", ".pytest_cache", ".mypy_cache", ] for d in dirs_to_remove: if os.path.exists(d): print(f" Removing directory: {d}") shutil.rmtree(d) # Files to remove file_patterns_to_remove = [ "**/*.pyc", "**/*.swp", "**/*.egg-info", "**/*.dist-info", ] for pattern in file_patterns_to_remove: # Use glob.glob with recursive=True for Python 3.5+ for f in glob.glob(pattern, recursive=True): if os.path.isfile(f) or os.path.isdir(f): # Check if it's a file or dir print(f" Removing: {f}") if os.path.isfile(f): os.remove(f) else: # It's a directory shutil.rmtree(f) print("Cleaning complete.") if __name__ == "__main__": clean_build_artifacts()
然后通过 python clean.py 执行清理。
b. Makefile (Linux/macOS)
在项目根目录创建Makefile文件:
.PHONY: clean clean: @echo "Cleaning Python build artifacts..." find . -type d -name "__pycache__" -exec rm -rf {} + find . -type f -name "*.pyc" -delete find . -type f -name "*.swp" -delete rm -rf build dist .pytest_cache .mypy_cache find . -type d -name "*.egg-info" -exec rm -rf {} + find . -type d -name "*.dist-info" -exec rm -rf {} + @echo "Cleaning complete."
然后通过 make clean 执行清理。
注意事项
- 谨慎操作: 在执行任何删除命令之前,请务必确认您正在操作正确的目录,并了解这些文件和目录的作用。错误地删除关键文件可能导致项目无法运行。
- 备份: 对于重要项目,在进行大规模清理之前进行备份是一个好习惯。
- 理解通配符: 使用rm -rf *或del *等命令时要格外小心,确保只删除目标文件,避免误删。
- 环境隔离: 始终在项目的虚拟环境(venv或conda env)中进行开发和构建,这有助于将项目依赖和构建产物隔离,避免污染系统环境。
- 区分生产与开发: 在生产环境中,通常只需要部署最终的包文件,不需要保留构建过程中的临时文件。
总结
随着Python项目构建工具和实践的演进,setup.py的传统清理方式已逐渐被淘汰。适应这一变化,掌握手动识别和清理构建产物的方法,并通过命令行工具、.gitignore或自动化脚本来管理项目整洁,是现代Python开发者必备的技能。定期清理不仅能释放磁盘空间,还能避免因旧的构建缓存导致的潜在问题,确保项目始终在一个干净、可控的环境中运行和构建。
好了,本文到此结束,带大家了解了《告别setup.py,Python项目清理新方法》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!

- 上一篇
- NodeList遍历优化技巧分享

- 下一篇
- Golang微服务测试:依赖注入与Mock实战技巧
-
- 文章 · python教程 | 14分钟前 |
- Python动态创建类的实用方法与示例
- 244浏览 收藏
-
- 文章 · python教程 | 32分钟前 |
- 多标签分类实战:使用MultiOutputClassifier教程
- 158浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python+Tesseract搭建OCR训练工具教程
- 126浏览 收藏
-
- 文章 · python教程 | 2小时前 | Python 生成器
- Python生成器使用教程及实例解析
- 138浏览 收藏
-
- 文章 · python教程 | 2小时前 |
- PyCharm写代码运行全流程教程
- 106浏览 收藏
-
- 文章 · python教程 | 2小时前 |
- Pythonsample随机抽样教程详解
- 389浏览 收藏
-
- 文章 · python教程 | 2小时前 |
- PyTorchCNN批次大小问题解决指南
- 349浏览 收藏
-
- 文章 · python教程 | 3小时前 |
- Python轮子包怎么用?
- 373浏览 收藏
-
- 文章 · python教程 | 3小时前 |
- BeautifulSoup提取文本的几种方法
- 199浏览 收藏
-
- 文章 · python教程 | 4小时前 |
- TapkeyAPI401错误怎么解决
- 477浏览 收藏
-
- 文章 · python教程 | 14小时前 | Python函数
- 函数返回函数,Python高阶技巧详解
- 378浏览 收藏
-
- 文章 · python教程 | 15小时前 |
- Python中ans是什么意思?
- 137浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 514次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 499次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- AI Mermaid流程图
- SEO AI Mermaid 流程图工具:基于 Mermaid 语法,AI 辅助,自然语言生成流程图,提升可视化创作效率,适用于开发者、产品经理、教育工作者。
- 196次使用
-
- 搜获客【笔记生成器】
- 搜获客笔记生成器,国内首个聚焦小红书医美垂类的AI文案工具。1500万爆款文案库,行业专属算法,助您高效创作合规、引流的医美笔记,提升运营效率,引爆小红书流量!
- 167次使用
-
- iTerms
- iTerms是一款专业的一站式法律AI工作台,提供AI合同审查、AI合同起草及AI法律问答服务。通过智能问答、深度思考与联网检索,助您高效检索法律法规与司法判例,告别传统模板,实现合同一键起草与在线编辑,大幅提升法律事务处理效率。
- 203次使用
-
- TokenPony
- TokenPony是讯盟科技旗下的AI大模型聚合API平台。通过统一接口接入DeepSeek、Kimi、Qwen等主流模型,支持1024K超长上下文,实现零配置、免部署、极速响应与高性价比的AI应用开发,助力专业用户轻松构建智能服务。
- 161次使用
-
- 迅捷AIPPT
- 迅捷AIPPT是一款高效AI智能PPT生成软件,一键智能生成精美演示文稿。内置海量专业模板、多样风格,支持自定义大纲,助您轻松制作高质量PPT,大幅节省时间。
- 190次使用
-
- Flask框架安装技巧:让你的开发更高效
- 2024-01-03 501浏览
-
- Django框架中的并发处理技巧
- 2024-01-22 501浏览
-
- 提升Python包下载速度的方法——正确配置pip的国内源
- 2024-01-17 501浏览
-
- Python与C++:哪个编程语言更适合初学者?
- 2024-03-25 501浏览
-
- 品牌建设技巧
- 2024-04-06 501浏览