2012-09-26 2 views
3

여러 유닉스 계열 릴리스에서 실행해야하는 스크립트를 작성하고 있습니다. 이들은 Python 2.x로 작성되었습니다.Hashbang 스크립팅 : Python 2 인터프리터를 얻는 방법?

불행히도 일부 최신 릴리스에서는이 "파이썬"대신 "파이썬 2"라는 이진 버전을 호출했습니다. 따라서, "#!/usr/bin/env python"은 제대로 설치된 파이썬 인터프리터를 찾기 위해 작동하지 않습니다. 어느 쪽이든 버전 3 통역사 (불량) 또는 전혀 통역사가 없습니다 (악화)

파이썬 스크립트를 작성하는 영리한 방법이 설치되어 있으면 파이썬 인터프리터와 함께로드됩니다. 그렇지 않으면 파이썬 인터프리터 if 설치 됐어? 나는 "파이썬"이 파이썬 3 일 때를 탐지하기 위해 다른 메커니즘을 사용해야 할 것이다. 그러나 그 시점에서 파이썬과 비슷한 환경에 있기 때문에 살아갈 수있다.

나는 리플 발사기를 쓰고 "findpython2"라고 쓰고 그것을 #로 사용할 수 있다고 상상해 봅니다! 이 스크립트에 대한 인터프리터는 findpython2를 검색 경로에 설치해야한다는 것을 의미합니다. 절대적으로 하위 최적 인이 스크립트는 절대 참조로 호출되기 때문에 경로에 있지 않습니다.

답변

6

유명한 펄 hashbang 트릭에서 영감을 얻기, 나는이 함께했다 : 대답에 대한

#!/bin/sh 
"""": 
python2 -c "" 2>/dev/null && exec python2 $0 ${1+"[email protected]"} 
python -c "" 2>/dev/null && exec python $0 ${1+"[email protected]"} 
echo "Could not find a python interpreter." 
exit 1 
""" 

print "hello python" 
+0

경로에 특정 프로그램의 존재 여부를 테스트 할 수있는 더 좋은 방법을 알고있는 사람은 알고 싶습니다. – ninjalj

+1

도 사용할 수 있습니다 :'$ (type -p python2) && interp = python2 || interp = 파이썬; exec $ interp "$ 0"$ {1 + "$ @"} ' –

+0

이것은 실제로 질문에 응답합니다. 단! 또한 환상적인 끔찍한 해킹 :-) –

4

유닉스 가장 좋은 배포판은 python2 및 2.x를 1에서 python (대부분의 배포판, 2.x) 중 하나를 연결하는 및 3.x로 설치합니다. 따라서 명시 적으로 원하는 것을 지정하는 것이 가장 좋습니다.

이 모든 PEP 394에 정의되어

어떤 상태 :

이 PEP는 파이썬 인터프리터의 기본 버전에 관계없이, 파이썬 스크립트 유닉스 계열의 시스템에서 호환성을 계속할 수 있도록하는 규칙을 제공합니다 (즉, python 명령에 의해 호출 된 버전).

  • python2는
  • python3는
  • 파이썬 python2 동일한 대상을 참조해야 파이썬 3.X 일부 버전을 참조한다 파이썬 2.X 일부 버전을 참조하지만 일부에 python3 참조 할 수도 배포판이 일을하지 않을 경우 출혈 에지 분포

그래서, 그것은 본질적으로 자신의 말에 버그입니다.

+0

감사합니다. 불행히도 시간의 영향을 무시합니다. 하나의 중요한 타겟 배포판은 Ubuntu 10.04 LTS입니다 (여전히 해당 배포판에 3 년간 지원됩니다.)이 링크는 설치되지 않습니다. 당신이 그것을 "버그"라고 부르는지는 중요하지 않습니다. 왜냐하면 그것이 내가 살아야하는 근거 진실이기 때문입니다. 또한, "실제"문제를 해결하려는 시도 동안,이 대답은 실제로 질문에 대답하지 않습니다. –

+0

@JonWatte 제 제안은 그 링크를 만드는 패치 스크립트를 제공하는 것입니다. –

+0

저는 root를 요구하고 싶지 않습니다. 그리고/usr/bin에 아무것도 설치할 필요가 없습니다. –

0

python 2에서 실행해야하는 경우 가장 좋은 방법은 통역사를 python2이라고 부르는 것입니다. 대부분의 유닉스 버전에는 /usr/bin/python//usr/bin/python2의 심볼릭 링크가 해당 바이너리에 있다고 생각합니다.

+0

위 참조 -이 질문에 대한 답은 실제로 대답하지 않습니다. –

관련 문제