¿Por qué no puede encontrar virtualenv de Python 3 algunos paquetes instalados?
Estoy trabajando con un entorno virtual de Python llamado env
para ejecutar Odoo. En el directorio bin
del entorno virtual tengo lo siguiente:
pip
pip3
pip3.8
python -> /usr/bin/python3
python3 -> python
python3.8 -> python
Y el servicio de Odoo está ejecutando este comando para ejecutar Odoo (como se puede ver, utilizando el python3.8
del entorno virtual):
ExecStart=/opt/odoo/env/bin/python3.8 /opt/odoo/odoo_13/src/oca/OCB/odoo-bin -c /opt/odoo/odoo_13/config/.odoo.conf
El problema es que de vez en cuando, Odoo da el siguiente error crítico y la instancia deja de funcionar:
ModuleNotFoundError: No module named 'werkzeug'
Parece que el paquete werkzeug
no está instalado, pero si hago lo siguiente:
anubia@my-server:/opt/odoo$ . env/bin/activate
(env) anubia@my-server:/opt/odoo$ which pip
/opt/odoo/env/bin/pip
(env) anubia@my-server:/opt/odoo$ which pip3
/opt/odoo/env/bin/pip3
(env) anubia@my-server:/opt/odoo$ which pip3.8
/opt/odoo/env/bin/pip3.8
(env) anubia@my-server:/opt/odoo$ pip3.8 install werkzeug
Requirement already satisfied: werkzeug in ./env/lib/python3.8/site-packages (0.11.15)
(env) anubia@my-server:/opt/odoo$ cd env/lib/python3.8/site-packages/
Así que werkzeug
parece estar instalado. ¿Cuál es el problema?
EDITAR
Después de intentar con la respuesta de @ChesuCR durante dos semanas, el servidor de Odoo dejó de funcionar nuevamente. Esta vez el error es:
ModuleNotFoundError: No module named 'PyPDF2'
Sin embargo, si compruebo el virtualenv
:
myuser@myserver:/opt/odoo$ . venv3.7/bin/activate
(venv3.7) myuser@myserver:/opt/odoo$ which python3.7
/opt/odoo/venv3.7/bin/python3.7
(venv3.7) myuser@myserver:/opt/odoo$ python3.7 -m pip install PyPDF2
Requirement already satisfied: PyPDF2 in ./venv3.7/lib/python3.7/site-packages (1.26.0)
(venv3.7) myuser@myserver:/opt/odoo$ python3.7 -m pip list
Package Version
----------------- ----------------------------------------
appdirs 1.4.4
attrs 21.2.0
Babel 2.6.0
beautifulsoup4 4.10.0
cached-property 1.5.2
certifi 2021.10.8
cffi 1.15.0
chardet 3.0.4
cryptography 36.0.0
decorator 4.3.0
defusedxml 0.7.1
docutils 0.14
ebaysdk 2.1.5
gevent 1.5.0
greenlet 0.4.15
html2text 2018.1.9
idna 2.8
isodate 0.6.0
Jinja2 2.10.1
libsass 0.17.0
lxml 4.3.2
Mako 1.0.7
MarkupSafe 1.1.0
mock 2.0.0
num2words 0.5.6
ofxparse 0.19
passlib 1.7.1
pbr 5.8.0
Pillow 6.1.0
pip 21.3.1
polib 1.1.0
psutil 5.6.6
psycopg2 2.7.7
pyasn1 0.4.8
pyasn1-modules 0.2.8
pycparser 2.21
pydot 1.4.1
pyOpenSSL 21.0.0
pyparsing 2.2.0
PyPDF2 1.26.0
pyserial 3.4
python-dateutil 2.7.3
python-stdnum 1.17
pytz 2019.1
pyusb 1.0.2
qrcode 6.1
reportlab 3.5.13
requests 2.21.0
requests-toolbelt 0.9.1
setuptools 57.5.0
six 1.16.0
soupsieve 2.3.1
urllib3 1.24.3
vatnumber 1.2
vobject 0.9.6.1
Werkzeug 0.14.1
wheel 0.37.0
xlrd 1.1.0
XlsxWriter 1.1.2
xlwt 1.3.0
zeep 3.2.0
Y, por supuesto, Odoo se está ejecutando con el intérprete de Python del virtualenv
:
ExecStart=/opt/odoo/venv3.7/bin/python3.7 /opt/odoo/odoo_13/src/oca/OCB/odoo-bin -c /opt/odoo/odoo_13/config/.odoo.conf
davy.ai
El problema parece ser que aunque
werkzeug
está instalado en elvirtualenv
, no se está cargando correctamente en Odoo. Una solución a esto es intentar agregar el directoriosite-packages
delvirtualenv
directamente a la variable de entornoPYTHONPATH
del servicio de Odoo antes de ejecutarlo.Para hacer esto, modifique la línea
ExecStart
en el archivo de unidad systemd del servicio de Odoo para agregarPYTHONPATH
antes del comando:Luego, recargue el demonio systemd y reinicie el servicio de Odoo:
Esto debería asegurar que el directorio
site-packages
delvirtualenv
esté disponible para el servicio de Odoo, lo que le permitirá cargar correctamente los paquetes instalados comowerkzeug
.Nota: si encuentra otros errores de módulos faltantes como
PyPDF2
, la misma solución de agregarPYTHONPATH
a la líneaExecStart
debería funcionar, siempre que el módulo faltante esté instalado en elvirtualenv
.