如何引用Python模块目录外的源文件?解决跨目录构建问题
两种解决方法实现方案
方案1:让构建过程复制兄弟目录到临时位置
python -m build会先执行sdist生成源码包,再解压到临时目录构建,所以要让sdist把兄弟目录的源文件一起打包:
- 在项目根目录(
py/的父目录)新建MANIFEST.in文件,写入:include sibling1/*.cpp include sibling2/*.cpp # 依次添加所有需要的兄弟目录cpp文件 include siblingN/*.cpp - 正常执行
python3.11 -m build .即可,此时sdist会把兄弟目录的源文件打包进源码包,临时构建目录里就能找到对应文件。
方案2:直接指向原始top目录构建(更优)
这种方法无需复制文件,直接调用原始目录的源文件构建,避免冗余操作:
方法一:原地构建扩展模块
在py/目录下执行命令:
python3.11 setup.py build_ext --inplace
该命令会直接在当前目录生成扩展模块,不会将源码复制到临时目录,之前用绝对路径指定的兄弟目录源文件能被正确识别。
方法二:可编辑安装(适合开发阶段)
如果需要开发时修改代码即时生效,执行:
pip install -e ./py/
这会创建指向原始源码的链接,构建时直接使用原始目录的文件,不会复制到临时位置。
方法三:调整build命令参数(保留build工具流程)
若必须使用python -m build,可配合参数跳过隔离环境并直接读取本地文件(仅适合本地开发,发布建议用方案1):
python3.11 -m build --wheel --no-isolation --skip-dependency-check
--no-isolation使用当前环境而非新建虚拟环境,--skip-dependency-check跳过依赖检查,此时构建工具会直接读取原始目录的兄弟文件。
内容的提问来源于stack exchange,提问作者Mikhail T.
相关产品推荐
相关产品推荐

