错误:无法为backports.zoneinfo构建wheels,这是安装基于pyproject.toml的项目所必需的。

54

在过去的几天中,当我尝试部署一个Django应用程序时,Heroku Build返回了这个错误。Django代码和文件结构与Django的官方文档相同,并且Procfile已添加到根文件夹中。

日志 -

-----> Building on the Heroku-20 stack
-----> Determining which buildpack to use for this app
-----> Python app detected
-----> No Python version was specified. Using the buildpack default: python-3.10.4
       To use a different version, see: https://devcenter.heroku.com/articles/python-runtimes
       Building wheels for collected packages: backports.zoneinfo
         Building wheel for backports.zoneinfo (pyproject.toml): started
         Building wheel for backports.zoneinfo (pyproject.toml): finished with status 'error'
         ERROR: Command errored out with exit status 1:
          command: /app/.heroku/python/bin/python /app/.heroku/python/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/_in_process.py build_wheel /tmp/tmpqqu_1qow
              cwd: /tmp/pip-install-txfn1ua9/backports-zoneinfo_a462ef61051d49e7bf54e715f78a34f1
         Complete output (41 lines):
         running bdist_wheel
         running build
         running build_py
         creating build
         creating build/lib.linux-x86_64-3.10
         creating build/lib.linux-x86_64-3.10/backports
         copying src/backports/__init__.py -> build/lib.linux-x86_64-3.10/backports
         creating build/lib.linux-x86_64-3.10/backports/zoneinfo
         copying src/backports/zoneinfo/_zoneinfo.py -> build/lib.linux-x86_64-3.10/backports/zoneinfo
         copying src/backports/zoneinfo/_tzpath.py -> build/lib.linux-x86_64-3.10/backports/zoneinfo
         copying src/backports/zoneinfo/_common.py -> build/lib.linux-x86_64-3.10/backports/zoneinfo
         copying src/backports/zoneinfo/_version.py -> build/lib.linux-x86_64-3.10/backports/zoneinfo
         copying src/backports/zoneinfo/__init__.py -> build/lib.linux-x86_64-3.10/backports/zoneinfo
         running egg_info
         writing src/backports.zoneinfo.egg-info/PKG-INFO
         writing dependency_links to src/backports.zoneinfo.egg-info/dependency_links.txt
         writing requirements to src/backports.zoneinfo.egg-info/requires.txt
         writing top-level names to src/backports.zoneinfo.egg-info/top_level.txt
         reading manifest file 'src/backports.zoneinfo.egg-info/SOURCES.txt'
         reading manifest template 'MANIFEST.in'
         warning: no files found matching '*.png' under directory 'docs'
         warning: no files found matching '*.svg' under directory 'docs'
         no previously-included directories found matching 'docs/_build'
         no previously-included directories found matching 'docs/_output'
         adding license file 'LICENSE'
         adding license file 'licenses/LICENSE_APACHE'
         writing manifest file 'src/backports.zoneinfo.egg-info/SOURCES.txt'
         copying src/backports/zoneinfo/__init__.pyi -> build/lib.linux-x86_64-3.10/backports/zoneinfo
         copying src/backports/zoneinfo/py.typed -> build/lib.linux-x86_64-3.10/backports/zoneinfo
         running build_ext
         building 'backports.zoneinfo._czoneinfo' extension
         creating build/temp.linux-x86_64-3.10
         creating build/temp.linux-x86_64-3.10/lib
         gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/app/.heroku/python/include/python3.10 -c lib/zoneinfo_module.c -o build/temp.linux-x86_64-3.10/lib/zoneinfo_module.o -std=c99
         lib/zoneinfo_module.c: In function ‘zoneinfo_fromutc’:
         lib/zoneinfo_module.c:600:19: error: ‘_PyLong_One’ undeclared (first use in this function); did you mean ‘_PyLong_New’?
           600 |             one = _PyLong_One;
               |                   ^~~~~~~~~~~
               |                   _PyLong_New
         lib/zoneinfo_module.c:600:19: note: each undeclared identifier is reported only once for each function it appears in
         error: command '/usr/bin/gcc' failed with exit code 1
         ----------------------------------------
         ERROR: Failed building wheel for backports.zoneinfo
       Failed to build backports.zoneinfo
       ERROR: Could not build wheels for backports.zoneinfo, which is required to install pyproject.toml-based projects
 !     Push rejected, failed to compile Python app.
 !     Push failed

谢谢。


你需要确保在settings.py脚本中没有使用SQLite数据库。必须进行更改。 - Conor
11个回答

108

在使用Python >= 3.9时,避免安装backports.zoneinfo

编辑您的requirements.txt文件

来自:

backports.zoneinfo==0.2.1

收件人:

backports.zoneinfo;python_version<"3.9"

或者:

backports.zoneinfo==0.2.1;python_version<"3.9"

您可以在此处此处阅读更多相关信息。


对我来说,backports.zoneinfo==0.2.1;python_version<"3.9" 这个可以工作。 - King Alawaka
如果您编译要求,也可以将其放入到您的requirements.in文件中,该条件将传递给编译的.piip(或.txt)文件。 - smido

42

我在部署我的应用到Heroku时遇到了同样的错误,其实问题是当你把应用部署到Heroku上时,Heroku默认使用Python版本为3.10.x,并且backports.zoneinfo与这个版本不兼容。所以我建议你切换到版本3.8.x(稳定版)。

为了做到这一点,你需要告诉Heroku切换到这个版本,具体操作如下:

  1. 根目录中创建一个名为runtime.txt的文件。
  2. 在'runtime.txt'中写入python-3.8.10来指定使用的Python版本。
  3. Heroku将会安装这个版本,之后你就不会再遇到这个错误。

PS:这对我起作用了,等Heroku解决了这个漏洞之后,你可以切换到最新版本的Python。


1
这个可以运行!只是别忘了在你的repo中添加 runtime.txt。关于这个的 Heroku 文档在这里:https://devcenter.heroku.com/articles/python-runtimes - Ryan Shirley

8

在创建容器时,我遇到了与您相同的错误。使用我的Python venv的确切版本即3.8.9解决了这个问题。

之前,我使用3.8-alpine来获取更轻量级的镜像,但是它并没有为我工作并出现了与您相同的错误。


2
感谢您的解决方案,我使用3.8.13-slim-buster代替alpine成功了。 - Talha Anwar

3
这种问题发生在您忘记修改 requirements.txt 文件时,Heroku 服务器使用默认设置,例如使用不稳定的 Python 更新版本。使用下面的命令,您将解决此类问题。
$ git status

您需要修改 requirements.txt 文件。

$ git add -A

$ git commit -m "Python 版本号-3.8.10"

然后推送到服务器,我相信您就能摆脱这种问题。

为了推送到服务器...

$ git push heroku master

3

在 Mac Pro 上尝试并测试:

在终端上检查您的 Python 版本

python3 --version

或者

python --version

如果Python版本是3.9及以上,则将以下(backports.zoneinfo)行在您的"requirements.txt"文件中更新为:
  • backports.zoneinfo;python_version<"3.9"

运行 -

pip3 install -r requirements.txt

再次运行你的应用程序测试,此时应该可以工作。


3

我将Python从3.10.5降级到3.9.0,这对我有用。希望这能帮到你。


这个问题涉及到在Heroku上部署,目前没有任何堆栈支持Python 3.9.0。 - Dr. Red

1

适用于MAC用户:

export C_INCLUDE_PATH=/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/Headers

只有这个帮助了我。来源在这里


1

如果你在使用CentOS操作系统,可能会缺少用于构建backports.zoneinfo所需的Python开发库之一。你可以尝试以下方法:

sudo yum install python3-devel

安装它们


1
我在将Scrapy爬虫部署到Heroku时遇到了同样的错误,但是在runtime.txt中使用python-3.9.15解决了这个问题。然而,我venv中安装的Python版本是3.8.13。
你可以尝试其中一个,我不知道它们的实际含义,但这些都是Heroku推荐的,你可以在这里阅读完整文档。
Supported runtimes
python-3.10.8 on all supported stacks (recommended)
python-3.9.15 on all supported stacks
python-3.8.15 on Heroku-18 and Heroku-20 only
python-3.7.15 on Heroku-18 and Heroku-20 only

0
使用Python版本3.11而不是3.12。
这些软件包yarl==1.9.2,frozenlist==1.3.3,aiohttp==3.8.4由于某种原因或尚未兼容,与Python 3.12不兼容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接