문제

실행 가능한 모든 Python 스크립트의 시작 부분에 오두막 선:

#!/usr/bin/env python

나는 다음과 같은 시스템에서 이 스크립트를 실행하고 있습니다. env python Python 2.2 환경을 생성합니다.호환되는 Python 버전을 수동으로 확인했기 때문에 스크립트가 빠르게 실패합니다.

if sys.version_info < (2, 4):
    raise ImportError("Cannot run with Python version < 2.4")

가능하다면 모든 실행 파일의 shebang 줄을 변경하고 싶지 않습니다.그러나 결과를 변경하기 위해 컴퓨터에 대한 관리 액세스 권한이 없습니다. env python 다음과 같이 특정 버전을 강제하고 싶지 않습니다.

#!/usr/bin/env python2.4

시스템에 Python 2.4보다 최신 버전이 있거나 Python 2.5는 있지만 Python 2.4가 없을 수 있으므로 이 문제를 피하고 싶습니다.

우아한 해결책은 무엇입니까?

[편집:] 질문을 제기할 때 충분히 구체적이지 않았습니다. 사용자가 수동 구성 없이 스크립트를 실행할 수 있도록 하고 싶습니다(예:경로 변경 또는 심볼릭 링크 ~/bin PATH가 ~/bin Python 2.2 경로 앞).수동 조정을 방지하려면 일부 배포 유틸리티가 필요할 수 있습니까?

도움이 되었습니까?

해결책

"env"는 단순히 PATH env var에서 찾은 첫 번째 항목을 실행합니다.다른 Python으로 전환하려면 스크립트를 호출하기 전에 해당 Python의 실행 파일에 대한 디렉터리를 경로 앞에 추가하세요.

다른 팁

매우 해킹적인 해결책 - 검사가 실패하면 이 기능(아마도 상당히 개선될 수 있음)을 사용하여 사용 가능한 최고의 해석기를 결정하고, 그것이 허용 가능한지 확인한 다음, 그렇다면 os.system 또는 이와 유사한 것으로 스크립트를 다시 시작하십시오. 새로운 인터프리터를 사용하여 argv.

import os
import glob
def best_python():
    plist = []
    for i in os.getenv("PATH").split(":"):
        for j in glob.glob(os.path.join(i, "python2.[0-9]")):
             plist.append(os.path.join(i, j))
    plist.sort()
    plist.reverse()
    if len(plist) == 0: return None
    return plist[0]

스크립트를 실행하는 경우 먼저 개인 bin 디렉터리를 가리키도록 PATH 변수를 설정할 수 있습니다.

$ mkdir ~/bin
$ ln -s `which python2.4` ~/bin/python
$ export PATH=~/bin:$PATH

그런 다음 Python 스크립트를 실행하면 Python 2.4가 사용됩니다.PATH를 변경하려면 로그인 스크립트를 변경해야 합니다.

또는 원하는 명시적 인터프리터를 사용하여 Python 스크립트를 실행하세요.

$ /path/to/python2.4 <your script>

@모라이스:흥미로운 아이디어지만, 한 단계 더 발전할 수 있을 것 같습니다.아마 활용법이 있을 것 같아요 Ian Bicking의 virtualenv 에게:

  • 시작하기에 적합한 환경에서 실행되고 있는지 확인하고 그렇다면 아무것도 하지 마십시오.
  • 버전별 실행 파일이 있는지 확인하세요. PATH, 즉.확인해보세요 python2.x 존재한다 for x in reverse(range(4, 10)).그렇다면 더 나은 해석기를 사용하여 명령을 다시 실행하십시오.
  • 더 나은 인터프리터가 없으면 virtualenv를 사용하여 이전 버전의 Python에서 최신 버전의 Python을 설치하고 필수 구성 요소 패키지를 가져옵니다.

나는 virtualenv가 이것을 할 수 있는지 전혀 모르기 때문에 조만간 그것을 다루게 될 것입니다.:)

(1) shebang 사용을 절대적으로 설정하고 (2) 빌드 프로세스에서 Autotools를 사용할 수 있는 경우 해결책은 다음과 같습니다.

어젯밤에 autoconf 매크로를 사용할 수 있다는 것을 알았습니다. AM_PATH_PYTHON 최소한의 Python을 찾으려면 2 바이너리.방법은 여기.

따라서 귀하의 프로세스는 다음과 같습니다.

  • 발행 AM_PATH_PYTHON(2.4) 당신의 configure.ac
  • 모든 이름을 바꾸십시오. .py 스크립트 .py.in (내 경험상 이것은 혼란스럽지 않습니다. vi)
  • 생성하려는 모든 Python 스크립트의 이름을 지정하세요. AC_CONFIG_FILES.
  • 다음으로 시작하는 대신 #!/usr/bin/env python, 사용 #!@PYTHON@

그럼 당신의 결과적인 Python 스크립트에는 항상 적절한 shebang이 있습니다.

따라서 실용적이지는 않더라도 적어도 가능한 이 솔루션이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top