J'ai écrit un programme simple python:gunicorn corrompt sys.path
# /tmp/src/Code.py
import sys
print sys.path
# /tmp/src/Main.py
import Code
Quand je lance avec python src/Main.py
, il fonctionne comme prévu:
max% cd /tmp
max% setenv PYTHONPATH src
max% python src/Main.py
['/tmp/src',
'/tmp/src',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-x86_64-linux-gnu',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/PILcompat',
'/usr/lib/python2.7/dist-packages/gtk-2.0',
'/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
Et juste pour vous assurer sys.path fonctionne correctement, je crée un fichier dans le répertoire de travail:
# /tmp/Code.py
print "I never said to search CWD!!! Your Python is broken."
import sys
print sys.path
Et le résultat est le même que ci-dessus, comme exp ect.
Cependant, quand je lance dans gunicorn je reçois:
max% gunicorn Main:app
2017-08-08 10:30:53 [26913] [INFO] Starting gunicorn 17.5
2017-08-08 10:30:53 [26913] [INFO] Listening at: http://127.0.0.1:8000 (26913)
2017-08-08 10:30:53 [26913] [INFO] Using worker: sync
2017-08-08 10:30:53 [26918] [INFO] Booting worker with pid: 26918
I never said to search CWD!!! Your Python is broken.
['/tmp',
'/usr/bin',
'/tmp/src',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-x86_64-linux-gnu',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/PILcompat',
'/usr/lib/python2.7/dist-packages/gtk-2.0',
'/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
Il semble que gunicorn a décidé au hasard d'ajouter PWD au sys.path. Il n'y a rien dans la page de manuel gunicorn à ce sujet.
configuration python:
Flask==0.10.1
Jinja2==2.7.2
MarkupSafe==0.18
PAM==0.4.2
Pillow==2.3.0
Twisted-Core==13.2.0
Twisted-Web==13.2.0
Werkzeug==0.9.4
adium-theme-ubuntu==0.3.4
apt-xapian-index==0.45
argparse==1.2.1
blinker==1.3
chardet==2.0.1
colorama==0.2.5
command-not-found==0.3
debtagshw==0.1
defer==1.0.6
dirspec==13.10
duplicity==0.6.23
gevent==1.0
greenlet==0.4.2
gunicorn==17.5
html5lib==0.999
httplib2==0.8
itsdangerous==0.22
lockfile==0.8
lxml==3.3.3
oauthlib==0.6.1
oneconf==0.3.7.14.04.1
pexpect==3.1
piston-mini-client==0.7.5
pyOpenSSL==0.13
pycrypto==2.6.1
pycups==1.9.66
pygobject==3.12.0
pyinotify==0.9.4
pyserial==2.6
pysmbc==1.0.14.1
python-apt==0.9.3.5ubuntu2
python-debian==0.1.21-nmu2ubuntu2
pyxdg==0.25
reportlab==3.0
requests==2.2.1
sessioninstaller==0.0.0
simplejson==3.3.1
six==1.5.2
software-center-aptd-plugins==0.0.0
ssh-import-id==3.21
system-service==0.1.6
unity-lens-photos==1.0
urllib3==1.7.1
wheel==0.24.0
wsgiref==0.1.2
xdiagnose==3.6.3build2
zope.interface==4.0.5
Je sais que je pouvais retirer PWD de la sys.path en recherchant realpath(p) == realpath('.')
mais parfois nous voulons PWD dans le PYTHONPATH. Donc, une solution plus prudente est nécessaire. Idéalement, nous essayons de déterminer quel logiciel introduit le bogue. Il se pourrait simplement que la page de manuel gunicorn soit incomplète?
J'ai trouvé que 'gunicorn --pythonpath src' fonctionne mieux que' setenv PYTHONPATH src'. J'aimerais que Gunicorn ait de la documentation. –
Il semble que gunicorn soit précédé de '--pythonpath' devant PWD, puis de' PYTHONPATH'. Donc toujours exécuter gunicorn avec '--pythonpath $ PYTHONPATH' devrait être une solution générale. Cela devrait vraiment être ajouté à la page de manuel. –
décrivez comment vous avez résolu votre problème en guise de réponse à la question, puis approuvez-le. – marcusshep