python - 在 Dreamhost 上安装 Python 3

标签 python passenger dreamhost

也许我在这里遗漏了一些东西,但我正在按照 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 服务器错误,但它似乎并不像我指定的 interpeter 实际上正在运行,正如这个输出所指示的那样。如果我指定了错误的解释器路径,它将完全失败,正如我所期望的那样。

> 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 解释器?

最佳答案

这是我的 passenger_wsgi.py,我用它来启动通过 pipenv 管理的 Flask 应用程序。这可能对您有帮助,也可能没有帮助,尽管除了我如何确定要运行哪个解释器之外,我看不出有什么主要不同。确保您指向的路径实际上不是符号链接(symbolic link)或启动错误 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 的建议约定并安装了前缀为 $HOME/opt/python-3.6.4 的 Python 3.6.4 并添加了 $HOME/opt/python-3.6.4/bin 到我的 $PATH,并使用 Python 的 make install 将它放在那个地方,没有额外的包装。 pipenv 是使用 pip install --user pipenv 安装的,我将 $HOME/.local/bin 添加到我的 $PATH以及。

关于python - 在 Dreamhost 上安装 Python 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22942455/

相关文章:

Python:筛选充满 unicode 的列表并将列表仅包含字符串

ruby-on-rails - Apache 上 Phusion Passenger 上的多个 Rails 应用程序

php - 无法连接到 Dreamhost 的数据库

服务器上传后 JavaScript 不工作

python: GraphAPIError: 无效的 OAuth 访问 token

python:使用 xlrd 从 excel 获取完整公式

python - 如何使用 numpy.logic_and 打印多个数组的元素?

python - 如何在 Django 中调试失败的测试?

ruby-on-rails - 使用 NginX 的乘客未在 Fedora 中注册为服务

ruby-on-rails - Bundler + RVM + Passenger + Capistrano 部署和缺少的 gem