简体   繁体   English

如何在 Heroku 上正确安装 PyICU?

[英]How to correctly install PyICU on Heroku?

I am trying to deploy my Python app on Heroku, but have been unsuccessful.我正在尝试在 Heroku 上部署我的 Python 应用程序,但没有成功。 It seems that a problem is occurring with the PyICU package, which I'm unsure how to correct. PyICU package 似乎出现了问题,我不确定如何纠正。 I've confirmed that this is the only issue with my deployment;我已经确认这是我部署的唯一问题; when I remove PyICU from my requirements file, everything works.当我从需求文件中删除PyICU时,一切正常。 But of course my site can't work without it.但当然,没有它我的网站就无法工作。

Can anyone please guide me in how to correctly install this package on Heroku?谁能指导我如何在 Heroku 上正确安装这个 package? I've tried various methods, including downloading the.whl file and then adding that to my requirements file, but then I get another error:我尝试了各种方法,包括下载 .whl 文件,然后将其添加到我的需求文件中,但随后出现另一个错误:

ERROR: PyICU-2.7.3-cp38-cp38m-win_amd64.whl is not a supported wheel on this platform. I don't understand why - it's the correct Python and os version.我不明白为什么 - 它是正确的 Python 和操作系统版本。

Here are the relevant excerpts from the build log:以下是构建日志的相关摘录:

-----> Building on the Heroku-20 stack
-----> Using buildpack: heroku/python
-----> Python app detected
-----> Using Python version specified in runtime.txt
-----> Installing python-3.8.10
-----> Installing pip 20.2.4, setuptools 47.1.1 and wheel 0.36.2
-----> Installing SQLite3
-----> Installing requirements with pip
       ...
         Building wheel for PyICU (setup.py): started
         Building wheel for PyICU (setup.py): finished with status 'error'
         ERROR: Command errored out with exit status 1:
          command: /app/.heroku/python/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-e4xp9bv_/pyicu/setup.py'"'"'; __file__='"'"'/tmp/pip-install-e4xp9bv_/pyicu/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-zeqs7m46
              cwd: /tmp/pip-install-e4xp9bv_/pyicu/
         Complete output (90 lines):
         (running 'icu-config --version')
         (running 'pkg-config --modversion icu-i18n')
         
         Building PyICU 2.4.3 for ICU 66.1
         
         (running 'icu-config --cxxflags --cppflags')
         Could not configure CFLAGS with icu-config
         (running 'pkg-config --cflags icu-i18n')
         (running 'icu-config --ldflags')
         Could not configure LFLAGS with icu-config
         (running 'pkg-config --libs icu-i18n')
         Adding LFLAGS="-licui18n -licuuc -licudata" from /usr/bin/pkg-config
         running bdist_wheel
         running build
         running build_py
         creating build
         creating build/lib.linux-x86_64-3.7
         copying PyICU.py -> build/lib.linux-x86_64-3.7
         creating build/lib.linux-x86_64-3.7/icu
         copying icu/__init__.py -> build/lib.linux-x86_64-3.7/icu
         running build_ext
         building '_icu' extension
         creating build/temp.linux-x86_64-3.7
         gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/app/.heroku/python/include/python3.7m -c _icu.cpp -o build/temp.linux-x86_64-3.7/_icu.o -DPYICU_VER="2.4.3"
         In file included from /usr/include/c++/9/clocale:42,
                          from /usr/include/x86_64-linux-gnu/c++/9/bits/c++locale.h:41,
                          from /usr/include/c++/9/bits/localefwd.h:40,
                          from /usr/include/c++/9/string:43,
                          from /usr/include/unicode/std_string.h:37,
                          from /usr/include/unicode/unistr.h:38,
                          from common.h:106,
                          from _icu.cpp:27:
         ./locale.h:29:23: error: ‘Locale’ was not declared in this scope; did you mean ‘locale_t’?
            29 | PyObject *wrap_Locale(Locale *locale, int flags);
               |                       ^~~~~~
               |                       locale_t
         ./locale.h:29:31: error: ‘locale’ was not declared in this scope; did you mean ‘locale_t’?
            29 | PyObject *wrap_Locale(Locale *locale, int flags);
               |                               ^~~~~~
               |                               locale_t
         ./locale.h:29:39: error: expected primary-expression before ‘int’
            29 | PyObject *wrap_Locale(Locale *locale, int flags);
               |                                       ^~~
         ./locale.h:29:48: error: expression list treated as compound expression in initializer [-fpermissive]
            29 | PyObject *wrap_Locale(Locale *locale, int flags);
               |                                                ^
         ./locale.h:30:29: error: ‘Locale’ does not name a type; did you mean ‘locale_t’?
            30 | PyObject *wrap_Locale(const Locale &locale);
               |                             ^~~~~~
               |                             locale_t
         ./locale.h:30:43: error: ‘PyObject* wrap_Locale(const int&)’ redeclared as different kind of entity
            30 | PyObject *wrap_Locale(const Locale &locale);
               |                                           ^
         ./locale.h:29:11: note: previous declaration ‘PyObject* wrap_Locale’
            29 | PyObject *wrap_Locale(Locale *locale, int flags);
               |           ^~~~~~~~~~~
         In file included from /usr/include/x86_64-linux-gnu/c++/9/bits/c++locale.h:41,
                          from /usr/include/c++/9/bits/localefwd.h:40,
                          from /usr/include/c++/9/string:43,
                          from /usr/include/unicode/std_string.h:37,
                          from /usr/include/unicode/unistr.h:38,
                          from common.h:106,
                          from _icu.cpp:27:
         /usr/include/c++/9/clocale:53:11: error: ‘::lconv’ has not been declared
            53 |   using ::lconv;
               |           ^~~~~
         /usr/include/c++/9/clocale:54:11: error: ‘::setlocale’ has not been declared
            54 |   using ::setlocale;
               |           ^~~~~~~~~
         /usr/include/c++/9/clocale:55:11: error: ‘::localeconv’ has not been declared
            55 |   using ::localeconv;
               |           ^~~~~~~~~~
         In file included from /usr/include/c++/9/bits/localefwd.h:40,
                          from /usr/include/c++/9/string:43,
                          from /usr/include/unicode/std_string.h:37,
                          from /usr/include/unicode/unistr.h:38,
                          from common.h:106,
                          from _icu.cpp:27:
         /usr/include/x86_64-linux-gnu/c++/9/bits/c++locale.h:52:23: error: ‘uselocale’ was not declared in this scope; did you mean ‘u_fsetlocale’?
            52 |   extern "C" __typeof(uselocale) __uselocale;
               |                       ^~~~~~~~~
               |                       u_fsetlocale
         /usr/include/x86_64-linux-gnu/c++/9/bits/c++locale.h: In function ‘int std::__convert_from_v(__locale_struct* const&, char*, int, const char*, ...)’:
         /usr/include/x86_64-linux-gnu/c++/9/bits/c++locale.h:75:53: error: ‘__gnu_cxx::__uselocale’ cannot be used as a function
            75 |     __c_locale __old = __gnu_cxx::__uselocale(__cloc);
               |                                                     ^
         /usr/include/x86_64-linux-gnu/c++/9/bits/c++locale.h:100:33: error: ‘__gnu_cxx::__uselocale’ cannot be used as a function
           100 |     __gnu_cxx::__uselocale(__old);
               |                                 ^
         error: command 'gcc' failed with exit status 1
         ----------------------------------------
         ERROR: Failed building wheel for PyICU
         Running setup.py clean for PyICU
       
           Running setup.py install for PyICU: started
           Running setup.py install for PyICU: finished with status 'error'
           ERROR: Command errored out with exit status 1:
            command: /app/.heroku/python/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-e4xp9bv_/pyicu/setup.py'"'"'; __file__='"'"'/tmp/pip-install-e4xp9bv_/pyicu/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-bdqgdfr6/install-record.txt --single-version-externally-managed --compile --install-headers /app/.heroku/python/include/python3.7m/PyICU
                cwd: /tmp/pip-install-e4xp9bv_/pyicu/
           Complete output (90 lines):
           (running 'icu-config --version')
           (running 'pkg-config --modversion icu-i18n')
           
           Building PyICU 2.4.3 for ICU 66.1
           
           (running 'icu-config --cxxflags --cppflags')
           Could not configure CFLAGS with icu-config
           (running 'pkg-config --cflags icu-i18n')
           (running 'icu-config --ldflags')
           Could not configure LFLAGS with icu-config
           (running 'pkg-config --libs icu-i18n')
           Adding LFLAGS="-licui18n -licuuc -licudata" from /usr/bin/pkg-config
           running install
           running build
           running build_py
           creating build
           creating build/lib.linux-x86_64-3.7
           copying PyICU.py -> build/lib.linux-x86_64-3.7
           creating build/lib.linux-x86_64-3.7/icu
           copying icu/__init__.py -> build/lib.linux-x86_64-3.7/icu
           running build_ext
           building '_icu' extension
           creating build/temp.linux-x86_64-3.7
           gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/app/.heroku/python/include/python3.7m -c _icu.cpp -o build/temp.linux-x86_64-3.7/_icu.o -DPYICU_VER="2.4.3"
           In file included from /usr/include/c++/9/clocale:42,
                            from /usr/include/x86_64-linux-gnu/c++/9/bits/c++locale.h:41,
                            from /usr/include/c++/9/bits/localefwd.h:40,
                            from /usr/include/c++/9/string:43,
                            from /usr/include/unicode/std_string.h:37,
                            from /usr/include/unicode/unistr.h:38,
                            from common.h:106,
                            from _icu.cpp:27:
           ./locale.h:29:23: error: ‘Locale’ was not declared in this scope; did you mean ‘locale_t’?
              29 | PyObject *wrap_Locale(Locale *locale, int flags);
                 |                       ^~~~~~
                 |                       locale_t
           ./locale.h:29:31: error: ‘locale’ was not declared in this scope; did you mean ‘locale_t’?
              29 | PyObject *wrap_Locale(Locale *locale, int flags);
                 |                               ^~~~~~
                 |                               locale_t
           ./locale.h:29:39: error: expected primary-expression before ‘int’
              29 | PyObject *wrap_Locale(Locale *locale, int flags);
                 |                                       ^~~
           ./locale.h:29:48: error: expression list treated as compound expression in initializer [-fpermissive]
              29 | PyObject *wrap_Locale(Locale *locale, int flags);
                 |                                                ^
           ./locale.h:30:29: error: ‘Locale’ does not name a type; did you mean ‘locale_t’?
              30 | PyObject *wrap_Locale(const Locale &locale);
                 |                             ^~~~~~
                 |                             locale_t
           ./locale.h:30:43: error: ‘PyObject* wrap_Locale(const int&)’ redeclared as different kind of entity
              30 | PyObject *wrap_Locale(const Locale &locale);
                 |                                           ^
           ./locale.h:29:11: note: previous declaration ‘PyObject* wrap_Locale’
              29 | PyObject *wrap_Locale(Locale *locale, int flags);
                 |           ^~~~~~~~~~~
           In file included from /usr/include/x86_64-linux-gnu/c++/9/bits/c++locale.h:41,
                            from /usr/include/c++/9/bits/localefwd.h:40,
                            from /usr/include/c++/9/string:43,
                            from /usr/include/unicode/std_string.h:37,
                            from /usr/include/unicode/unistr.h:38,
                            from common.h:106,
                            from _icu.cpp:27:
           /usr/include/c++/9/clocale:53:11: error: ‘::lconv’ has not been declared
              53 |   using ::lconv;
                 |           ^~~~~
           /usr/include/c++/9/clocale:54:11: error: ‘::setlocale’ has not been declared
              54 |   using ::setlocale;
                 |           ^~~~~~~~~
           /usr/include/c++/9/clocale:55:11: error: ‘::localeconv’ has not been declared
              55 |   using ::localeconv;
                 |           ^~~~~~~~~~
           In file included from /usr/include/c++/9/bits/localefwd.h:40,
                            from /usr/include/c++/9/string:43,
                            from /usr/include/unicode/std_string.h:37,
                            from /usr/include/unicode/unistr.h:38,
                            from common.h:106,
                            from _icu.cpp:27:
           /usr/include/x86_64-linux-gnu/c++/9/bits/c++locale.h:52:23: error: ‘uselocale’ was not declared in this scope; did you mean ‘u_fsetlocale’?
              52 |   extern "C" __typeof(uselocale) __uselocale;
                 |                       ^~~~~~~~~
                 |                       u_fsetlocale
           /usr/include/x86_64-linux-gnu/c++/9/bits/c++locale.h: In function ‘int std::__convert_from_v(__locale_struct* const&, char*, int, const char*, ...)’:
           /usr/include/x86_64-linux-gnu/c++/9/bits/c++locale.h:75:53: error: ‘__gnu_cxx::__uselocale’ cannot be used as a function
              75 |     __c_locale __old = __gnu_cxx::__uselocale(__cloc);
                 |                                                     ^
           /usr/include/x86_64-linux-gnu/c++/9/bits/c++locale.h:100:33: error: ‘__gnu_cxx::__uselocale’ cannot be used as a function
             100 |     __gnu_cxx::__uselocale(__old);
                 |                                 ^
           error: command 'gcc' failed with exit status 1
           ----------------------------------------
       ERROR: Command errored out with exit status 1: /app/.heroku/python/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-e4xp9bv_/pyicu/setup.py'"'"'; __file__='"'"'/tmp/pip-install-e4xp9bv_/pyicu/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-bdqgdfr6/install-record.txt --single-version-externally-managed --compile --install-headers /app/.heroku/python/include/python3.7m/PyICU Check the logs for full command output.
 !     Push rejected, failed to compile Python app.
 !     Push failed

I have a requirements.txt file specifying all the dependencies:我有一个requirements.txt文件指定所有依赖项:

asgiref==3.2.7
astroid==2.3.3
beautifulsoup4==4.9.0
certifi==2020.6.20
chardet==3.0.4
click==7.1.2
colorama==0.4.3
confusable-homoglyphs==3.2.0
DAWG==0.8.0
DAWG-Python==0.7.2
defusedxml==0.6.0
diff-match-patch==20181111
dj-database-url==0.5.0
Django==3.0.3
django-autoslug-iplweb==1.9.4.dev0
django-bootstrap-form==3.4
django-bootstrap3==12.1.0
django-bootstrap4==1.1.1
django-chartit==0.2.9
django-cleanup==4.0.0
django-countries==6.1.2
django-filter==2.3.0
django-heroku==0.3.1
django-import-export==2.2.0
django-language-field==0.0.3
django-nested-admin==3.3.2
django-registration==3.1
django-restframework==0.0.1
django-tables2==2.3.1
djangorestframework==3.11.0
docopt==0.6.2
et-xmlfile==1.0.1
futures==3.1.1
gunicorn==20.1.0
idna==2.9
isort==4.3.21
jdcal==1.4.1
joblib==0.15.1
lazy-object-proxy==1.4.3
MarkupPy==1.14
mccabe==0.6.1
Morfessor==2.0.6
nltk==3.5
numpy==1.19.0
odfpy==1.4.1
openpyxl==3.0.3
Pillow==7.1.2
pkgconfig==1.5.1
polyglot==16.7.4
progressbar2==3.51.3
psycopg2==2.8.6
pycld2==0.41
# ./PyICU-2.4.3-cp38-cp38-win_amd64.whl   <--I've tried various combinations here
PyICU==2.4.3
pylint==2.4.4
pymorphy2==0.8
pymorphy2-dicts==2.4.393442.3710985
pymystem3==0.2.0
python-dateutil==2.8.1
python-decouple==3.4
python-Levenshtein==0.12.0
python-monkey-business==1.0.0
python-utils==2.4.0
pytz==2019.3
PyYAML==5.3.1
regex==2020.6.8
requests==2.24.0
rutermextract==0.3
six==1.13.0
soupsieve==2.0
sqlparse==0.3.1
tablib==2.0.0
tqdm==4.46.1
unicodecsv==0.14.1
Unidecode==1.1.1
urllib3==1.25.9
whitenoise==5.2.0
wincertstore==0.2
wrapt==1.11.2
xlrd==1.2.0
xlwt==1.3.0

My Procfile looks as follows:我的Procfile如下所示:

web: gunicorn mysite.wsgi

In runtime.txt I have:runtime.txt我有:

python-3.8.10

I would be very grateful if someone can recommend a fix, thanks.如果有人能推荐一个修复方法,我将非常感激,谢谢。 I know that PyICU is not the easiest to install even locally, but how do I go about telling Heroku how to do it?我知道 PyICU 即使在本地也不是最容易安装的,但是我该如何告诉 Heroku 怎么做呢?

Edit : I tried adding a custom buildpack for ICU: https://github.com/generalassembly/heroku-icu-buildpack编辑:我尝试为 ICU 添加自定义构建包: https://github.com/generalassembly/heroku-icu-buildpack

It seems to run a bit differently then, but still get errors with regard to locale and also the following:它似乎运行起来有点不同,但仍然会出现关于语言环境的错误以及以下错误:

gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now
Building ICU 57.1
/tmp/codon/tmp/buildpacks/ad1815f7543324e4f0c006136b48e4be140b5627/bin/compile: line 24: pushd: icu/source: No such file or directory
/tmp/codon/tmp/buildpacks/ad1815f7543324e4f0c006136b48e4be140b5627/bin/compile: line 26: ./runConfigureICU: No such file or directory
make: *** No targets specified and no makefile found.  Stop.
make: *** No rule to make target 'install'.  Stop.
/tmp/codon/tmp/buildpacks/ad1815f7543324e4f0c006136b48e4be140b5627/bin/compile: line 30: popd: directory stack empty
Caching build
cp: cannot stat '/app/icu': No such file or directory

I haven't tried this myself, but it may be possible to use heroku-buildpack-apt to install PyICU using their Debian installation method .我自己没有尝试过,但是可以使用heroku-buildpack-apt来安装 PyICU,使用他们的 Debian安装方法

Otherwise, your wheel needs to be the same version as the server's operating system, not your development machine's OS.否则,您的轮子需要与服务器操作系统的版本相同,而不是您的开发机器的操作系统。 You can try building the wheel inside the Heroku dyno using a technique in this StackOverflow answer .您可以尝试使用此 StackOverflow 答案中的技术在 Heroku 测功机内部构建轮子。

I don't have a repo to test these methods, so I'm not sure how well they'll work.我没有测试这些方法的存储库,所以我不确定它们的效果如何。 I will be happy to update this answer if you try them out.如果您尝试一下,我将很乐意更新此答案。

Why are you using the windows wheel ( PyICU-2.7.3-cp38-cp38m-win_amd64.whl )?你为什么使用 windows 轮( PyICU-2.7.3-cp38-cp38m-win_amd64.whl )? You probably need a manylinux wheel.你可能需要一个manylinux轮子。

You can also try pyicu-binary package.你也可以试试pyicu-binary package。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM