首页 > 解决方案 > 你如何在包含包的仓库之外构建一个轮子?

问题描述

问题

有没有办法在不同的存储库中为包构建轮子,这样轮子的构建与在包含包的存储库中构建轮子时完全一样?

例子

考虑以下回购:

/repo-containing-your-package
      |___ your_module/
      |___ setup.py

构建方法 A

当我python setup.py bdist_wheel从内部运行时,repo-containing-your-package它会按预期构建轮子,包括your_module. 这意味着在我安装pip install ./dist/your_module-#.#.#-py3-none-any.whl(成功)之后,我可以从命令行运行python -m your_module.foo

构建包时,我得到的输出验证我的模块已被轮子拾取:

creating 'dist/your_module-#.#.#-py3-none-any.whl' and adding 'build/bar' to it
adding 'your_module/__init__.py'
etc...

构建方法 B

但是,如果我python ../repo-containing-your-package/setup.py bdist_wheel从一个repo-containing-your-packageyour_module. 这意味着在我安装pip install ./dist/your_module-#.#.#-py3-none-any.whl(成功)之后,尝试python -m your_module.foo失败:

Error while finding module specification for 'your_module.foo' (ModuleNotFoundError: No module named 'your_module')

通过查看构建输出来确认模块没有与包一起正确安装的事实,其中不包括adding 'your_module'方法 A 包含的输出。

标签: pythonpippython-wheel

解决方案


我知道的两种解决方案:

更改工作目录setup.py

如果您可以修改设置脚本,则可以通过编程方式更改工作目录。os.chdir在设置脚本中尽早添加调用:

import os
from setuptools import setup

os.chdir(os.path.dirname(__file__))

setup(...)

您还可以通过其他方式更改工作目录,而无需修改设置脚本,例如bash

$ pushd path/to/repo; python setup.py bdist_wheel; popd

利用pip wheel

pip有一个wheel从给定 arg 构建轮子的子命令;这个 arg 通常是包的名称,但也可以是包含安装脚本的目录。在这种情况下通过-e,以便轮子具有正确的名称:

$ pip wheel -e path/to/repo

推荐阅读