나는 다양한 환경 (및 PATH)과 다양한 Linux 시스템을 가진 다양한 사용자가 이론적으로 실행할 수있는 Python 스크립트가있는 흥미로운 상황에 처해 있습니다. 인공적인 제한없이이 스크립트를 가능한 많은 스크립트에서 실행할 수 있기를 바랍니다. 알려진 설정은 다음과 같습니다.
- Python 2.6은 시스템 Python 버전이므로 python, python2 및 python2.6은 모두 / usr / bin에 있으며 동등합니다.
- Python 2.6은 위와 같이 시스템 Python 버전이지만 Python 2.7은 python2.7과 함께 설치됩니다.
- Python 2.4는 시스템 Python 버전이며 내 스크립트는 지원하지 않습니다. / usr / bin에는 python, python2 및 python2.4가 동일하며 스크립트가 지원하는 python2.5가 있습니다.
이 세 가지 모두에서 동일한 실행 가능한 파이썬 스크립트를 실행하고 싶습니다. /usr/bin/python2.7을 먼저 사용하려고 시도한 경우 (있는 경우) /usr/bin/python2.6으로 폴백 한 다음 /usr/bin/python2.5로 폴백 한 다음 좋을 것입니다. 존재하지 않는 경우 오류가 발생합니다. 그래도 가능한 경우 최신 통역사 중 하나를 찾을 수있는 한 가능한 최신 2.x를 사용하여 너무 매달리지 않았습니다.
나의 첫 번째 성향은 shebang 라인을 다음에서 변경하는 것이 었습니다.
#!/usr/bin/python
에
#!/usr/bin/python2.[5-7]
이것은 bash에서 잘 작동하기 때문입니다. 그러나 스크립트를 실행하면 다음이 제공됩니다.
/usr/bin/python2.[5-7]: bad interpreter: No such file or directory
좋아, 그래서 bash에서 작동하는 다음을 시도하십시오.
#!/bin/bash -c /usr/bin/python2.[5-7]
그러나 다시 이것은 실패합니다.
/bin/bash: - : invalid option
좋아, 분명히 올바른 인터프리터를 찾고 발견 한 인터프리터를 사용하여 파이썬 스크립트를 실행하는 별도의 쉘 스크립트를 작성할 수 있습니다. 최신 python 2 인터프리터가 설치된 경우 하나만 있으면 두 파일을 배포하는 번거 로움이 있습니다. 사람들에게 통역사를 명시 적으로 호출하도록 요청 $ python2.5 script.py
하는 것은 옵션이 아닙니다. 특정 방식으로 설정되는 사용자의 PATH에 의존하는 것도 옵션이 아닙니다.
편집하다:
Python 2.6에서 존재하는 "with"문을 사용하고 있기 때문에 Python 스크립트 내에서 버전 확인 기능 이 작동 하지 않습니다 (2.5에서와 함께 사용할 수 있음 from __future__ import with_statement
). 이로 인해 스크립트가 사용자에게 친숙하지 않은 SyntaxError와 함께 즉시 실패하고 버전을 먼저 확인하여 적절한 오류가 발생하는 것을 막을 수 있습니다.
예 : (2.6 미만의 Python 인터프리터로 시도하십시오)
#!/usr/bin/env python
import sys
print "You'll never see this!"
sys.exit()
with open('/dev/null', 'w') as out:
out.write('something')
./script.py
:) python2.4가 스크립트 를 실행하여 코드가 잘못된 버전임을 감지하고 종료 될 수 있습니다. 그러나 대신 통역사로 사용될 수있는 완벽하게 좋은 python2.5가 있습니다!
exec
이 있는지 확인하고, 그렇지 않은 경우 오류를 인쇄하십시오.
execve
). 인수는 문자열 리터럴, globbing 없음, 정규 표현식 없음입니다. 그게 다야. 첫 번째 인수가 "/ bin / bash"이고 두 번째 옵션 ( "-c ...") 인 경우에도 해당 옵션은 쉘에 의해 구문 분석되지 않습니다. 그것들은 bash 실행 파일로 처리되지 않으므로 이러한 오류가 발생합니다. 또한 shebang은 처음 시작하는 경우에만 작동합니다. 그래서 당신은 운이 좋지 않습니다. 두려워합니다 (파이썬 인터프리터를 찾아서 여기에 닥터에게 먹이는 스크립트가 부족합니다).
import sys; sys.version_info()
사용자에게 필요한 파이썬 버전이 있는지 확인할 수 있습니다 .