2014-04-08 5 views
2

아마 여기에 뭔가 빠졌지 만 Dreamhost의 설명서에서 사용자 지정 Python 인터프리터를 설치하는 방법을 따르고 있습니다. 파이썬 2.x -> 파이썬 3.x에서 execl()과 관련된 문제가 의심 스럽지만 확신 할 수 없습니다. 여기 Dreamhost에 Python 3 설치

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 인터프리터를 두 번 실행하는 이유는 무엇입니까?

+0

"os.execl (INTERP, INERP, * sys.argv)"에서 두 번째 항목에 대해 "INTERP"의 철자가 틀린 경우 – Wolf

+0

게시 할 때 우연히 backspace를 눌렀을 것으로 생각됩니다. 나는 대본에서 정확하게 철자를 기입했으나 여전히 효과가 없었다. 게다가 다른 예외가있었습니다. –

답변

0

여기 내 passenger_wsgi.pypipenv을 통해 관리되는 Flask 앱을 ​​실행하는 데 사용됩니다. 이것은 도움이 될 수도 있고 도움이되지 않을 수도 있습니다. 그러나 나는 어떤 통역사를 운영 할 것인지를 결정하는 것과는 크게 다른 것을 볼 수 없습니다. 가리키는 경로가 실제로 심볼릭 링크가 아니거나 잘못된 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) 

는 지금까지 내 환경이가는대로, 나는에 넣어 파이썬의 make install 추가 래퍼로를 DreamHost는의 제안 규칙을 다음과 $HOME/opt/python-3.6.4의 접두사로 파이썬 3.6.4을 설치하고 내 $PATH$HOME/opt/python-3.6.4/bin을 추가 및 사용 장소. pipenvpip install --user pipenv을 사용하여 설치했으며 에도 $HOME/.local/bin을 추가했습니다.