2017-08-08 2 views
2

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?

+1

J'ai trouvé que 'gunicorn --pythonpath src' fonctionne mieux que' setenv PYTHONPATH src'. J'aimerais que Gunicorn ait de la documentation. –

+0

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. –

+0

décrivez comment vous avez résolu votre problème en guise de réponse à la question, puis approuvez-le. – marcusshep

Répondre

1

Modifier /usr/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py et modifiez la ligne suivante:

sys.path.insert(0, cwd) 

à:

sys.path.append(cwd) 

Ensuite --pythonpath fonctionne comme prévu.

+0

Comment est-ce que nous faisons un paquet python standard qui exécute l'édition montrée ci-dessus? Appelons notre paquet 'gunicorn_pythonpath_enabler' ou quelque chose comme ça. –

+0

Faire une requête pull à Gunicorn serait plus efficace que d'empaqueter un patch dans un peu de lib. – bfontaine