在Dreamhost上安装Python 3
我可能漏掉了什么,但我正在按照Dreamhost的文档来安装一个自定义的Python解释器。我怀疑在Python 2.x到Python 3.x的过程中,execl()
可能有问题,但我不能确定。
http://wiki.dreamhost.com/Python#Building_a_custom_version_of_Python
我遇到的问题是,似乎同一个解释器被运行了两次,尽管我告诉它要用其他的解释器。
import os, sys
log = file('/home/user/mysite.com/passengerwsgi.log', 'a')
log.write("Running %s\n" % (sys.executable))
log.write("Python %s\n" % (sys.version))
log.write("Path %s\n" % (sys.path))
INTERP = "/home/user/Python-3.3.5/bin/python3.3"
PACKAGES = "/home/user/mysite.com/packages"
if sys.executable != INTERP:
log.write("Detected wrong interpreter location, swapping to %s\n" % (INTERP))
# Swapping interpreters will not flush any files.
log.flush()
log.close()
os.execl(INTERP, INERP, *sys.argv)
# Should resume execution from the top of the file.
log.write("Loading pypiserver...")
log.flush()
sys.path.append(os.getcwd())
import site
import pypiserver
application = pypiserver.app(PACKAGES, redirect_to_fallback=False)
当它运行时,我得到了可怕的500服务器错误,但看起来我指定的解释器并没有真正运行,这从输出中可以看出来。如果我指定了一个错误的解释器路径,它会完全失败,这也是我预期的结果。
> Running /usr/bin/python Python 2.6.6 (r266:84292, Dec 26 2010,
> 22:31:48) [GCC 4.4.5] Path
> ['/usr/local/dh/passenger/lib/phusion_passenger/wsgi',
> '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2',
> '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old',
> '/usr/lib/python2.6/lib-dynload',
> '/usr/local/lib/python2.6/dist-packages',
> '/usr/lib/python2.6/dist-packages',
> '/usr/lib/python2.6/dist-packages/PIL',
> '/usr/lib/pymodules/python2.6'] Detected wrong interpreter location,
> swapping to /home/user/Python-3.3.5/bin/python3.3 Running
> /usr/bin/python Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48) [GCC
> 4.4.5] Path ['/usr/local/dh/passenger/lib/phusion_passenger/wsgi', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2',
> '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old',
> '/usr/lib/python2.6/lib-dynload',
> '/usr/local/lib/python2.6/dist-packages',
> '/usr/lib/python2.6/dist-packages',
> '/usr/lib/python2.6/dist-packages/PIL',
> '/usr/lib/pymodules/python2.6'] Detected wrong interpreter location,
> swapping to /home/user/Python-3.3.5/bin/python3.3
为什么它会执行/usr/bin/python解释器两次呢?
1 个回答
1
这是我用来启动一个通过 pipenv
管理的 Flask 应用的 passenger_wsgi.py
文件。这个内容可能对你有帮助,也可能没有,不过我觉得没有什么特别大的不同,主要就是我确定使用哪个解释器的方法。确保你指向的路径不是一个符号链接或者是一个会启动错误 Python 版本的脚本。
import sys, os
import subprocess
INTERP = subprocess.check_output(['pipenv', 'run', 'which', 'python3']).strip().decode('utf-8')
if sys.executable != INTERP:
os.execl(INTERP, INTERP, *sys.argv)
sys.path.append(os.getcwd())
from my_site import app
# hackish way to make Passenger urldecode the same way WSGI does
import urllib.parse
def application(environ, start_response):
environ["PATH_INFO"] = urllib.parse.unquote(environ["PATH_INFO"])
return app(environ, start_response)
关于我的环境,我按照 Dreamhost 的建议安装了 Python 3.6.4,并将它放在 $HOME/opt/python-3.6.4
这个路径下,然后把 $HOME/opt/python-3.6.4/bin
加入到我的 $PATH
里。我使用 Python 的 make install
命令,没有额外的包装,就把它安装到那个地方。pipenv
是通过 pip install --user pipenv
安装的,我也把 $HOME/.local/bin
加入到了我的 $PATH
中。