gunicorn被破坏的sys.path
我写了一个简单的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不完整?
编辑/usr/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py
并更改以下行:
sys.path.insert(0, cwd)
到:
sys.path.append(cwd)
然后--pythonpath
按预期工作。
我们如何制作执行上述编辑的标准python包?让我们打电话给我们的包'gunicorn_pythonpath_enabler'或其他。 –
向Gunicorn发出拉请求比在某些lib中打包补丁效率更高。 – bfontaine
我发现'gunicorn --pythonpath src'比'setenv PYTHONPATH src'更好。我希望gunicorn有实际的文件。 –
看起来,gunicorn在PWD前加上'--pythonpath',然后是'PYTHONPATH'。所以总是用'--pythonpath $ PYTHONPATH'运行gunicorn应该是一个通用的解决方案。这真的应该添加到联机帮助页。 –
描述你如何解决你的问题作为问题的答案,然后批准它。 – marcusshep