Ошибка ImportError: нет модуля с именем 'encodings' в виртуальной среде, использующей pyenv - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь опубликовать сайт, созданный Django, используя apache.Настройки сервера:

・ CentOS 7.2
・ Python 3.6
・ Django 2.0
・ apache 2.4

Я готовлю виртуальную среду с использованием pyenvследующим образом.

git clone https://github.com/yyuu/pyenv.git ~/.pyenv
…
pyenv install anaconda3-5.1.0
pyenv rehash
pyenv global anaconda3-5.1.0
…
yum install httpd httpd-devel
systemctl start httpd
systemctl enable httpd
….
wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.5.14.tar.gz
tar -zxvf 4.5.14.tar.gz
cd mod_wsgi-4.5.14/
./configure --with-python=/home/username/.pyenv/versions/anaconda3-5.1.0/bin/python
make
sudo make install
…

■ httpd.conf

NameVirtualHost *:80
LoadModule wsgi_module /usr/lib64/httpd/modules/mod_wsgi.so
WSGISocketPrefix /var/run/wsgi
<VirtualHost *:80>

ServerName xxx.com
DocumentRoot /var/www/html

WSGIScriptReloading On
WSGIDaemonProcess xxx python-path=/home/username/.pyenv/versions/anaconda3-5.1.0/lib/python3.6/site-packages python-home=/home/username/.pyenv/versions/anaconda3-5.1.0
WSGIProcessGroup xxx
WSGIScriptAlias / /var/www/html/xxx/xxx/wsgi.py

<Directory "/xxx/">
Order deny,allow
</Directory>
</VirtualHost>

При этой настройке произойдет следующая ошибка.

Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'

Настройка chmod должна быть в порядке.Какие еще причины можно рассмотреть?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Версия 4.5.14 mod_wsgi устарела, используйте последнюю версию.

Предпочтительнее установить ее, используя pip install mod_wsgi, к вашей установке виртуальной среды Python, поскольку это гарантирует, что будет выбрана правильная общая библиотека Python, котораякогда это не происходит, может вызвать эту проблему.

Затем запустите mod_wsgi-express module-config, чтобы показать строки конфигурации для добавления в Apache для загрузки mod_wsgi.Сюда также может входить строка LoadFile для дальнейшего применения правильной библиотеки Python, что важно для Anaconda Python.

Затем используйте конфигурацию:

# I really hope you haven't thrown away your complete Apache
# config file. This should already be defined as part of the
# default Apache config file.

NameVirtualHost *:80

# Put here the output of running mod_wsgi-express module-config.

# Also turn of embedded mode using the following since using
# daemon mode.

WSGIRestrictEmbedded on


# This may not actually be required. Only needed on some RHEL
# and CentOS systems.

WSGISocketPrefix /var/run/wsgi

<VirtualHost *:80>

ServerName xxx.com
DocumentRoot /var/www/html

WSGIScriptReloading On

# The python-path wasn't needed. BTW, don't recommend using pyenv
# if using PSF Python as their default formula for building Python
# from source code doesn't create a shared library so it will not
# work with mod_wsgi. Anaconda Python is probably okay as it would
# use binary distro.

# Ensure python-home is what is value of sys.prefix for Python.

WSGIDaemonProcess xxx python-home=/home/username/.pyenv/versions/anaconda3-5.1.0

WSGIProcessGroup xxx

# Also force main interpreter if have only one app.

WSGIApplicationGroup %{GLOBAL}

WSGIScriptAlias / /var/www/html/xxx/xxx/wsgi.py

# Apache 2.4 should use 'Require all granted'.

# The ``/xxx`` path should match full absolute directory of WSGI
# script file used in ``WSGIScriptAlias``, so not right here.

<Directory "/xxx/">
Require all granted
</Directory>
</VirtualHost>

Кстати, плохая идеяпоместить исходный код Python в ту же директорию, что и DocumentRoot.Если вы прокомментируете WSGIScriptAlias, люди могут загрузить ваш код.

0 голосов
/ 23 мая 2018

Вы должны добавить

WSGIPythonHome /path/to/virtualenv/

к httpd.conf

https://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...