【发布时间】:2018-01-16 09:48:58
【问题描述】:
我写了一个简单的python程序:
# /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
结果和上面一样,和预期的一样。
但是,当我在 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 手册页中没有关于此的任何内容。
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
我知道我可以通过搜索 realpath(p) == realpath('.') 从 sys.path 中删除 PWD,但有时我们需要 PYTHONPATH 中的 PWD。所以需要更谨慎的解决方案。理想情况下,我们会尝试找出是哪个软件引入了这个错误。可能只是 gunicorn 联机帮助页不完整?
【问题讨论】:
-
我发现
gunicorn --pythonpath src比setenv PYTHONPATH src效果更好。我希望 gunicorn 有实际的文档。 -
gunicorn 似乎在 PWD 前面加上
--pythonpath,然后是PYTHONPATH。所以总是用--pythonpath $PYTHONPATH运行 gunicorn 应该是一个通用的解决方案。这确实应该添加到手册页中。 -
描述您如何解决问题作为问题的答案,然后批准。
-
不,不。事实证明
--pythonpath不可靠。在 gunicorn 19.6.0 上,PWD 仍然插入到路径的前面。 -
看来,如果您破解
wsgiapp.py,如下面的回答所示,那么--pythonpath将按预期工作。