如何保留工作目录.py文件但在构建PyPI分发包时排除指定.py文件
问题根因说明
你遇到的MANIFEST.in不生效问题是Python打包的默认机制导致的:MANIFEST.in 仅控制**源码分发包(sdist)**的文件清单,对构建生成的wheel(bdist_wheel)包内容没有决定权。wheel的文件列表由setuptools的包发现逻辑直接控制,这也是你配置排除规则后,用户pip安装仍然能看到对应文件的核心原因。
方案1:彻底将指定.py文件排除在所有发布包外(sdist+wheel均不包含)
如果你需要目标文件完全不出现在用户安装后的目录中,直接在pyproject.toml中配置setuptools的包发现排除规则即可,完全适配你当前使用的src目录布局:
[tool.setuptools.packages.find] where = ["src"] # 对应你存放源码的src目录 # 填写要排除的模块路径,支持通配符,比如要排除包下的internal_util.py模块就写: exclude = ["your_package_name.internal_util*"]
配置完成后必须清理旧的构建缓存再重新打包,否则之前生成的残留文件会被带入新包,导致配置不生效:
# 删除旧构建产物 rm -rf build/ dist/ src/*.egg-info # 重新构建sdist和wheel python -m build
构建完成后可以直接把生成的.whl文件当zip包解压,检查目标文件是否已经被排除,确认无误后再上传PyPI即可。这个配置不会影响你本地工作目录和Git仓库的文件,被排除的文件会正常留在本地、同步到GitHub,只是不会被打进发布包。
方案2:仅限制用户访问,不彻底移除包内文件
如果你的核心诉求只是不让终端用户通过from your_package import *直接调用该模块,你目前在用的临时方案本身就是Python打包的通用规范,完全可以正式使用,还可以搭配两个规则让实现更严谨:
- 给内部模块名加单下划线前缀,比如将
helper.py重命名为_helper.py。Python社区约定单下划线开头的模块属于内部实现细节,不对外提供稳定API,且from xxx import *默认会自动跳过所有下划线开头的成员,不需要额外配置。 - 在包的
__init__.py中明确定义__all__列表,逐一枚举所有允许对外暴露的类、函数、模块,import *时只会导入列表内的成员,从规则层面锁死对外接口。
内容的提问来源于stack exchange,提问作者AndrewJaeyoung
相关产品推荐
相关产品推荐

