Estoy tratando de implementar mi aplicación de Python en Heroku, pero no he tenido éxito. Parece que está ocurriendo un problema con el paquete PyICU , que no estoy seguro de cómo corregirlo. He confirmado que este es el único problema con mi implementación; cuando PyICU de mi archivo de requisitos, todo funciona. Pero, por supuesto, mi sitio no puede funcionar sin él.
¿Alguien puede guiarme sobre cómo instalar correctamente este paquete en Heroku? Probé varios métodos, incluida la descarga del archivo .whl y luego lo agregué a mi archivo de requisitos, pero luego aparece otro error:
ERROR: PyICU-2.7.3-cp38-cp38m-win_amd64.whl is not a supported wheel on this platform. No entiendo por qué: es la versión correcta de Python y os.
Aquí están los extractos relevantes del registro de compilación:
-----> 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 Tengo un archivo requirements.txt que especifica todas las dependencias:
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 Mi Procfile se ve de la siguiente manera:
web: gunicorn mysite.wsgi
En runtime.txt tengo:
python-3.8.10
Estaría muy agradecido si alguien puede recomendar una solución, gracias. Sé que PyICU no es el más fácil de instalar incluso localmente, pero ¿cómo le digo a Heroku cómo hacerlo?
Editar : intenté agregar un paquete de compilación personalizado para ICU: https://github.com/generalassembly/heroku-icu-buildpack
Entonces parece funcionar un poco diferente, pero aún recibe errores con respecto a la configuración regional y también lo siguiente:
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¿Por qué está usando la rueda de Windows ( PyICU-2.7.3-cp38-cp38m-win_amd64.whl )? Probablemente necesite una rueda manylinux .
También puede probar el paquete pyicu-binary .
No lo he intentado yo mismo, pero puede ser posible usar heroku-buildpack-apt para instalar PyICU usando su método de instalación de Debian.
De lo contrario, su rueda debe tener la misma versión que el sistema operativo del servidor, no el sistema operativo de su máquina de desarrollo. Puede intentar construir la rueda dentro del banco de pruebas Heroku usando una técnica en esta respuesta de StackOverflow .
No tengo un repositorio para probar estos métodos, así que no estoy seguro de qué tan bien funcionarán. Estaré encantado de actualizar esta respuesta si los prueba.