我正在使用C库和ctypes构建一个python包.

我找到了一个策略,在安装包的过程中使用build_extpip来构建库.它会根据目标的平台创建libfoo.dlllibfoo.dyliblibfoo.so.

问题是我的用户需要安装CMake.

在安装过程中是否存在另一种避免建筑的策略?我必须在包中Bundle 构建的库吗?

我想让我的用户保持pip install mylib.

Edit:感谢@Dawid comment,我正试图用python setup.py bdist_wheel命令生成一个python wheel,但没有成功.

How can I create my python wheel for different platform with the embedded library ?

Edit 2:我使用的是python 3.4和Mac OS X,但我可以使用Windows电脑和Linux电脑

推荐答案

根据我的研究,你肯定走对了路...正如丹尼尔所说,你唯一的 Select 就是自己构建和分发二进制文件.

一般来说,推荐的安装软件包的方法在packaging user guide中有详细介绍.我不会重复这里的建议,因为你显然已经找到了.然而,其中的关键点是Python社区,特别是PyPA,正在try 使用platform wheels来标准化二进制扩展.遗憾的是,目前存在一些问题:

  1. 您不能为所有Linux变体创建发行版,但可以为兼容的子集构建控制盘.详情见https://www.python.org/dev/peps/pep-0513/.
  2. advice on building extensions有点不完整,反映出二进制分布缺乏完整的解决方案.
  3. 然后,人们试图建立自己的库,并将其作为数据文件分发,这会混淆安装工具.

我想你正在讨论最后一个问题.workaround是通过重写is_pure()以始终返回False来强制发行版构建平台控制盘.不过,您可以保留原始的构建说明,而bdist_wheel应该可以处理它.

但是,一旦你构建了轮子,你仍然需要分发它,或者分发它使用的其他二进制软件包.在这一点上,您可能需要使用recommended tools个(如conda)或PyPI代理(如devpi)中的一个来为您的车轮提供服务.

EDIT: To answer the extra question about cross-compiling

如前所述,here Python 2.6及更高版本允许对Windows 32/64位版本进行交叉编译.在其他平台上没有对其他软件包的正式支持,人们已经有limited success人试图这样做.您最好在每个Linux/Mac/Windows环境中进行本机构建.

Python-3.x相关问答推荐

Python网页抓取:代码输出:汤未定义

按小时和日期对Pandas 数据帧进行分组

Pandas 插入的速度太慢了.对于跟踪代码,什么是更快的替代方案?

新行是pandas数据帧中旧行的组合

找到在指定列的另一个分组中存在重复的行.

python3,将整数转换为字节:对于小整数使用 to_bytes() 有哪些替代方法?

Python base64.b32hexencode 未创建预期结果

attrs 将 list[str] 转换为 list[float]

使用 GEKKO 使用代码解决最佳时间控制问题时出现 IndexError

协议不支持地址系列在将 Scapy L3socket 与 WSL 一起使用时

Dask 多阶段资源设置导致 Failed to Serialize 错误

使用 python-binance 时,heroku [regex._regex_core.error: bad escape \d at position 7] 出错

PyQt:退出时没有错误消息(回溯)

Python:如何在三个列表中找到共同值

无法在 Windows Python 3.5 上安装 Levenshtein 距离包

'~'(波浪号)运算符在 Python 中的应用

如何等待 create_task() 创建的任务完成?

如何使用请求发送带有标头的 PATCH 请求

Selenium Python - 处理没有这样的元素异常

python中的绝对导入是什么?