You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保留工作目录.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:01:48