如果无法使用二进制车轮(对于没有预构建车轮可用或车轮安装被禁用的平台),则可以从源代码构建gevent。正常的 pip install
如果没有可用的二进制车轮,将回退到执行此操作。(如果你愿意 developing gevent,您还需要从源代码安装;请按照该链接了解更多详细信息。)
您可以使用 pip install --no-binary gevent gevent
. 如果有可用的二进制控制盘,但要更改编译时选项(例如使用libuv的系统版本而不是嵌入式版本),则此选项非常有用。见 生成时间配置 .
您将需要一个可以运行的C编译器来构建Python扩展。在某些平台上,您可能需要安装Python开发包。
从源安装需要 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
等等,意思相同。这些别名仍然有效,但已弃用并打印警告。
Next page: 开发