Heroku не удается связать python-javabridge (javahome не найден)

#python #heroku #java-bridge-method

#python #heroku #java-bridge-метод

Вопрос:

Я пытаюсь развернуть свое первое приложение Plotly Dash (написанное на Python) в Heroku. У меня возникли проблемы с объединением всех пакетов для компиляции приложения, в настоящее время с Python-javabridge.

Когда я пытаюсь развернуть свое приложение, даже после удаления python-javabridge из requirements.txt , оно все равно пытается связать его, выдавая следующую ошибку:

 remote:        Collecting jeepney>=0.4.2; sys_platform == "linux"
remote:          Downloading jeepney-0.6.0-py3-none-any.whl (45 kB)
remote:        Collecting importlib-resources; python_version < "3.7"
remote:          Downloading importlib_resources-4.1.1-py3-none-any.whl (22 kB)
remote:        Collecting python-javabridge==4.0.0
remote:          Downloading python-javabridge-4.0.0.tar.gz (1.3 MB)
remote:            ERROR: Command errored out with exit status 1:
remote:             command: /app/.heroku/python/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-qllzoihk/python-javabridge/setup.py'"'"'; __file__='"'"'/tmp/pip-install-qllzoihk/python-javabridge/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'rn'"'"', '"'"'n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-xeh4coov
remote:                 cwd: /tmp/pip-install-qllzoihk/python-javabridge/
remote:            Complete output (11 lines):
remote:            Traceback (most recent call last):
remote:              File "<string>", line 1, in <module>
remote:              File "/tmp/pip-install-qllzoihk/python-javabridge/setup.py", line 412, in <module>
remote:                ext_modules=ext_modules(),
remote:              File "/tmp/pip-install-qllzoihk/python-javabridge/setup.py", line 96, in ext_modules
remote:                java_home = find_javahome()
remote:              File "/tmp/pip-install-qllzoihk/python-javabridge/javabridge/locate.py", line 133,
in find_javahome
remote:                java_bin = get_out(["bash", "-c", "type -p java"])
remote:              File "/tmp/pip-install-qllzoihk/python-javabridge/javabridge/locate.py", line 130,
in get_out
remote:                raise Exception("Error finding javahome on linux: %s" % cmd)
remote:            Exception: Error finding javahome on linux: ['bash', '-c', 'type -p java']
remote:            ----------------------------------------
remote:        ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
remote:  !     Push rejected, failed to compile Python app.
remote:
remote:  !     Push failed
 

Что я сделал:

Просто запуск pip install javabridge работает отлично, никаких проблем.

Я добавил JAVA_HOME в свои системные переменные и в path, не помогло. Запись javac или java --version в cmd выводит версию, как и ожидалось.

Я использую Windows 10, Python 3.7, Anaconda3, Spyder terminal для запуска команд.

Комментарии:

1. Вы должны более подробно объяснить, что вы там делаете, и особенно то, как задействован Heroku.

2. Спасибо за отзыв, я добавил еще немного информации, приношу извинения за отсутствие ясности 🙂

3. Heroku работает под управлением Linux. Эти журналы поступают с серверов Heroku (обратите внимание на «удаленный:»). Вы отправляете свой код в Heroku, и он попытается установить зависимости вашего приложения на свои серверы.

4. Heruko работает на Linux и будет создавать ваше приложение в Linux. И для этого он не может использовать ваше локально установленное программное обеспечение, такое как Java. Чтобы отладить, почему удаленная зависимость все еще установлена, проверьте git status и опубликуйте требования.

5. Если pip install javabridge работает нормально локально , на вашем компьютере, это не означает, что он также будет работать на Heroku. Так что вам нужно исправить не только JAVA_HOME вашей среды, но и то, как Heroku может установить тот же пакет в свою собственную среду (которая полностью отделена от вашего компьютера с Windows).

Ответ №1:

Если вы хотите использовать Java из приложения Python на Heroku, вам нужно будет использовать несколько пакетов сборки. Обратите внимание, что

Пакет сборки для основного языка вашего приложения всегда должен быть последним пакетом сборки в списке. Это гарантирует, что значения по умолчанию для этого основного языка применяются вместо значений по умолчанию для другого языка, и позволяет Heroku правильно определять основной язык вашего приложения.

Итак, в этом случае сделайте что-то вроде

 PS C:> heroku buildpacks:set heroku/python
PS C:> heroku buildpacks:add --index 1 heroku/jvm
 

Если вы запустите heroku buildpacks , теперь вы должны увидеть, что пакет сборки JVM указан первым, а пакет сборки Python указан вторым. Обратите внимание, что мы используем heroku/jvm здесь, а не heroku/java , поскольку вы не создаете Java-приложение.

После этого вам нужно будет повторно развернуть ваше приложение. Если вам нужно внести изменения, сделайте их, затем зафиксируйте и нажмите.

Обратите внимание, что вашему приложению может потребоваться использовать Java bridge, даже если вы не зависите от него напрямую requirements.txt , например, если от него зависит одна из ваших зависимостей.

Комментарии:

1. Спасибо, что нашли время, чтобы помочь мне с этим, мне нужно еще кое-что почитать, предоставленные вами ссылки были очень полезны! Я настроил пакеты сборки, и хотя теперь java_home находится, теперь я получаю ошибку ModuleNotFoundError: «Нет модуля с именем «numpy» из python-javabridge setup.py file…it это первый раз, когда у меня возникла такая ошибка

2. PS Похоже, это связано с тем, что heroku / git запускает setup.py файл перед загрузкой numpy, поэтому его решение, похоже, требует углубления в некоторые инструменты настройки, с которыми я не знаком. Но я выбираю ваш ответ как правильный, так как он решил проблему java_home, над которой я застрял на несколько дней, спасибо вам за это 🙂

3. Странно. Находится javabridge в вашем requirements.txt ? Я знаю, ты сказал, что вынул его, но положил ли ты его обратно? Если нет, то как вы его устанавливаете? О чем numpy это ?

4. Я удалил его навсегда, но он все равно пытается установить его вместе с несколькими другими пакетами.. Вы упомянули, что это может быть, что они являются требованиями для некоторых зависимостей? Numpy установлен и указан в requirements.txt.У меня есть pip, установленные javabridge и numpy на моем локальном компьютере, и все в порядке. Кажется, это обычная проблема с развертыванием приложений, но я не настолько опытен, чтобы самостоятельно изменять setuptools javabridge.. forum.predix.io/questions/30529 /…

5. @Isquare1, чтобы уточнить, у вас, вероятно, не должно быть Pipfile . Это альтернатива requirements.txt , и она имеет приоритет в Heroku. Я просто пытался выяснить, может ли Heroku использовать другой набор зависимостей. Используйте либо (a) requirements.txt , либо (b) Pipfile и Pipfile.lock , а не оба.