2017-08-08 30 views
2

我写了一个简单的Python程序:gunicorn被破坏的sys.path

# /tmp/src/Code.py 
import sys 
print sys.path 

# /tmp/src/Main.py 
import Code 

当我与python src/Main.py运行它,它按预期工作:

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'] 

而只是为了确保sys.path中工作吧,我在工作目录中创建一个文件:

# /tmp/Code.py 
print "I never said to search CWD!!! Your Python is broken." 
import sys 
print sys.path 

,结果是上面一样,为exp ected。

然而,当我在gunicorn运行我得到:

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'] 

看来,gunicorn随机决定PWD添加到sys.path中。关于这个在gunicorn的manpage中没有任何内容。

蟒蛇配置:

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 

我知道我可以通过搜索realpath(p) == realpath('.')从sys.path中删除PWD但有时我们想PWD在PYTHONPATH。因此需要更谨慎的解决方案。理想情况下,我们会试图找出哪个软件引入了该错误。这可能只是说,gunicorn的manpage不完整?

+1

我发现'gunicorn --pythonpath src'比'setenv PYTHONPATH src'更好。我希望gunicorn有实际的文件。 –

+0

看起来,gunicorn在PWD前加上'--pythonpath',然后是'PYTHONPATH'。所以总是用'--pythonpath $ PYTHONPATH'运行gunicorn应该是一个通用的解决方案。这真的应该添加到联机帮助页。 –

+0

描述你如何解决你的问题作为问题的答案,然后批准它。 – marcusshep

回答

1

编辑/usr/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py并更改以下行:

sys.path.insert(0, cwd) 

到:

sys.path.append(cwd) 

然后--pythonpath按预期工作。

+0

我们如何制作执行上述编辑的标准python包?让我们打电话给我们的包'gunicorn_pythonpath_enabler'或其他。 –

+0

向Gunicorn发出拉请求比在某些lib中打包补丁效率更高。 – bfontaine