从源安装#
如果无法使用二进制车轮(对于没有预构建车轮可用或车轮安装被禁用的平台),则可以从源代码构建gevent。正常的 pip install
如果没有可用的二进制车轮,将回退到执行此操作。(如果你愿意 developing gevent,您还需要从源代码安装;请按照该链接了解更多详细信息。)
一般注意事项#
您可以使用
pip install --no-binary gevent gevent
. 如果有可用的二进制控制盘,但要更改编译时选项(例如使用libuv的系统版本而不是嵌入式版本),则此选项非常有用。见 生成时间配置 .你需要 pip 19 and setuptools 40.8 功能齐全 PEP 518 和 PEP 517 支持从源安装gevent。
您将需要一个可以运行的C编译器工具链,它可以构建Python扩展。在某些平台上,您可能需要安装Python开发包。你还需要编译的能力 cffi 模块,可能需要安装FFI开发包。安装 make 以及其他常见的公用事业,如 file 也可能需要。
例如,在Alpine Linux上,可能需要执行以下操作:
apk add --virtual build-deps file make gcc musl-dev libffi-dev
在Fedora 33的羊皮上,可能需要这样做:
yum install python3-devel gcc kernel-devel kernel-headers make diffutils file
(更新版本的Fedora使用
dnf
用于包管理,但在撰写本文时yum
仍然可用并广泛使用,特别是在向后兼容方面。)在Ubuntu 20.04的Docker映像上,可能需要执行以下操作::
apt-get install python3.9-full python3.9-dev linux-headers-virtual make gcc libtool
见 issue #1567 , issue #1559 和 issue #1566 .
备注
确切的外部依赖项不一定是固定的,它取决于捆绑的C库(如libev、libuv和C-ares)的配置脚本。禁用 嵌入库 使用系统库可以减少这些依赖性,尽管这并不受鼓励。
在旧版本的Linux上,链接到
librt
可能有助于避免libev访问当前时间的系统调用。一种方法是设置LDFLAGS
要包含的环境变量-lrt
从源安装时。(这是在gevent构建多个inux轮子时自动完成的。)请参阅 pull request #1650 .从源安装需要
setuptools
. 这将自动安装在虚拟环境中,并通过构建进行安装。然而,GEvent使用 PEP 496 环境标记setup.py
. 因此,您需要比25(2016年年中)更新的安装工具版本来从源代码安装gevent;太旧的版本将产生ValueError
. 旧版本的pipenv也可能 have issues installing gevent for this reason .gevent 1.5及更高版本提供了一个
pyproject.toml
安装构建依赖项的文件,包括cffi(libuv支持所需)。此支持需要PIP 18或更高版本。你可以用pip VCS support 直接从其代码存储库安装gevent。这有助于检查您遇到的错误是否已被修复。例如,要安装当前的开发版本:
pip install git+git://github.com/gevent/gevent.git#egg=gevent
通常情况下,人们会以这种方式安装到虚拟环境中。
如果您使用的是PIP 18或更高版本,那么这就是您所需要的。如果您有困难,请参阅开发说明以了解更多信息。
常见安装问题#
以下是从源代码处编译gevent的一些常见安装问题和解决方案。
一些Linux发行版现在使用
noexec
选项。这可能导致标准pip install gevent
因错误而失败cannot run C compiled programs
. 一个解决方法是不使用该选项挂载临时目录。另一种可能是使用--build
选择权pip install
指定另一个目录。见 issue #570 和 issue #612 举个例子。还要检查与环境变量的冲突,如
CFLAGS
. 例如,请参见 Library Updates .最新SmartOS版本的用户可能需要自定义
CPPFLAGS
(包含C预处理器默认选项的环境变量)如果它们使用的是GEvent附带的libev。见 Operating Systems 更多信息。如果你看到
ValueError: ("Expected ',' or end-of-list in", "cffi >= 1.11.5 ; sys_platform == 'win32' and platform_python_implementation == 'CPython'", 'at', " ; sys_platform == 'win32' and platform_python_implementation == 'CPython'")
安装工具的版本太旧。安装更新版本的安装工具。
生成时间配置#
有几个旋钮可以在gevent构建时进行调整。这些对下游包装机最有用。它们都采用环境变量的形式,必须在 setup.py
被称为(注意 pip install
将调用 setup.py
)。具有布尔值的切换标志的形式可以是0/1、true/false、off/on、yes/no。
CPPFLAGS
构建C扩展时使用的标准变量。gevent可能会对这个变量做一些细微的修改。
CFLAGS
构建C扩展时使用的标准变量。gevent可能会对这个变量做一些细微的修改。
LDFLAGS
构建C扩展时使用的标准变量。gevent可能会对这个变量做一些细微的修改。
GEVENTSETUP_EV_VERIFY
如果设置,则该值作为
EV_VERIFY
嵌入libev时的C编译器宏。一般来说,设置
CPPFLAGS
更通用,可以包含libev识别的其他宏。
嵌入库#
默认情况下,gevent构建并嵌入其C依赖项libev、libuv和C-ares的测试版本。这是推荐的配置,因为使用的特定版本由GEvent测试,有时需要应用补丁。此外,嵌入,特别是在libev的情况下,可以更高效,因为gevent不需要的特性可以被禁用,从而导致库或运行时更小或更快。
但是,可以同时禁用所有库或单个库。
当禁用嵌入库时,库必须以编译器可以访问和链接的方式安装在系统上(即正确 CPPFLAGS
等)以便使用相应的C扩展。
GEVENTSETUP_EMBED
默认为真的布尔值。关闭时(例如,
GEVENTSETUP_EMBED=0
)库没有嵌入到gevent c扩展中。如果没有定义更具体的版本,则此值将用作所有库的默认值。GEVENTSETUP_EMBED_LIBEV
控件嵌入libev。
GEVENTSETUP_EMBED_CARES
控件嵌入c-ares。
GEVENTSETUP_EMBED_LIBUV
这没有定义或使用,只有CFFI扩展可用,并且这些扩展总是嵌入的。
支持旧版本的gevent EMBED
和 LIBEV_EMBED
等等,意思相同。这些别名仍然有效,但已弃用并打印警告。