从源安装#

如果无法使用二进制车轮(对于没有预构建车轮可用或车轮安装被禁用的平台),则可以从源代码构建gevent。正常的 pip install 如果没有可用的二进制车轮,将回退到执行此操作。(如果你愿意 developing gevent,您还需要从源代码安装;请按照该链接了解更多详细信息。)

一般注意事项#

  • 您可以使用 pip install --no-binary gevent gevent . 如果有可用的二进制控制盘,但要更改编译时选项(例如使用libuv的系统版本而不是嵌入式版本),则此选项非常有用。见 生成时间配置 .

  • 你需要 pip 19 and setuptools 40.8 功能齐全 PEP 518PEP 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 #1567issue #1559issue #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 #570issue #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 EMBEDLIBEV_EMBED 等等,意思相同。这些别名仍然有效,但已弃用并打印警告。