Pandas нельзя импортировать для нескольких приложений mod_wsgi на одном сервере.

Мне нравится иметь несколько экземпляров одного и того же приложения wsgi, работающих на сервере apache/mod_wsgi. Приложения настраиваются двумя файлами .conf в conf-available/conf.enabled. Первое приложение работает нормально, второе (до сих пор не пробовал третье) завершается со следующей ошибкой (из /var/log/apache/error.log):

  • ImportError: Обнаружено изменение интерпретатора — этот модуль может быть загружен только в один интерпретатор для каждого процесса.
  • Во время обработки вышеупомянутого исключения произошло другое исключение:
  • ...
  • ImportError: Расширение C: Обнаружено изменение интерпретатора — этот модуль может быть загружен только в один интерпретатор для каждого процесса. не построен. Если вы хотите импортировать pandas из исходного каталога, вам может потребоваться запустить «python setup.py build_ext --inplace --force», чтобы сначала собрать расширения C.

Мои файлы .conf выглядят одинаково, только с изменением My_App1 для каждого:

WSGIDaemonProcess My_App1 python-home=/var/wsgi/My_App1/venv
WSGIProcessGroup My_App1
WSGIScriptAlias /MyApp1 /var/wsgi/My_App1/odmf.wsgi
<Directory /var/wsgi/My_App1>
    Require all granted
</Directory>

Я все еще новичок в apache2/mod_wsgi, но я понимаю директиву WSGIProcessGroup, что я запускаю разные процессы для каждого приложения. Как панды могут знать, что их нужно запускать в нескольких экземплярах? Я использую venv для виртуальных сред. Поскольку на более позднем этапе приложения могут работать в разных версиях, необходимо использовать какие-то разные среды. Однако я получаю те же ошибки, когда пытаюсь использовать одну и ту же среду для обоих приложений.

ОС: Убунту 18.04

Apache/2.4.29 (Ubuntu) OpenSSL/1.1.1c mod_wsgi/4.5.17 Python/3.6 configured

person oekopez    schedule 06.04.2020    source источник


Ответы (1)


Была похожая проблема (только с lxml etree) с mod_wsgi/django и apache.

У меня есть несколько приложений django, работающих через vhosts в apache, причем каждое приложение работает в своем собственном процессе демона mod_wsgi (ничего не делясь).

Вот как я решил это:

wsgi.py (в приложении django), строка с комментариями была сгенерирована автоматически.

# os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'theapp.settings')
os.environ["DJANGO_SETTINGS_MODULE"] = "theapp.settings"

Конфигурация Apache

WSGIDaemonProcess My_App1 processes=2 threads=15 lang='C.UTF-8' locale='C.UTF-8' display-name=myapp1 python-home=/var/wsgi/My_App1/venv python-path=/path/to/My_App1
WSGIProcessGroup My_App1
WSGIApplicationGroup %{GLOBAL}
WSGIScriptAlias /MyApp1 /var/wsgi/My_App1/odmf.wsgi process-group=My_App1
<Directory /var/wsgi/My_App1>
    Require all granted
</Directory>
person Vvandil    schedule 19.10.2020