2012-07-03 2 views
8

!

System A 우분투를 실행하고 여러 가지의 무리에 대한 Python 2.6 필요합니다.
System A
System B에 기본적으로 Python 2.7을 설치했습니다. Python 2.7이 기본적으로 있습니다.
/I이 문제가 빈/ENV 파이썬

저는 #!/bin/env python 위쪽에 파이썬 스크립트 BLAH이 있습니다.
또 다른 스크립트 SIGH을 실행합니다. 위로 가기도 #!/bin/env python입니다.

BLAH
System A 또는 System B 중 하나에서 실행해야하며 항상 Python 2.7

지금까지 내 솔루션의 ----
부 실행해야합니다 :
먼저 확인하려고 래퍼 스크립트가를 which python이 파이썬 2.7을 가리키고 있다면
괜찮 으면 파이썬을위한 경로로 BLAH을 실행하십시오.
그렇지 않으면 which python2.7을 시도하고 해당 경로를 사용하여 BLAH을 실행하고 그 경로를 env PATH에 추가하십시오. 이 솔루션

문제는 다음과 같습니다
(파이썬 2.7 별도로 설치했다) System A

BLAH 실행하는, 그것 때문에 내가 좋아 지금까지 (쓴 래퍼 스크립트의 파이썬 2.7으로 실행
때 ..) BLAHSIGH를 생성합니다 때
SIGH 경로에 파이썬을 찾기 위해 오두막을 사용하고 envPATH에서 파이썬을 찾고 그것이 경로에 python2.7을 찾고해야하기 때문에 그것은 문제입니다.

이 문제를 올바르게 처리 할 수 ​​있습니까?

미리 감사드립니다.

+0

BLAH에서 SIGH를 가져 와서 실행할 수 있습니까? –

+0

''which '에서 얻은 경로를''PATH' -''which''에''PATH''에 포함 된 경로 만 검색하면됩니다. – jedwards

답변

9

, 내가

#!/bin/env python2.7 

에 첫 번째 라인을 변경 것 그리고 python2.7가 경로에 있는지 확인 (당신은 추가해야 할 수 있습니다 적절한 경우 심볼릭 링크). 필자가 사용한 모든 배포판에서 이러한 심볼릭 링크가 이미 존재합니다.

(사실, python는, 내 경우에는, python -> python2 -> python2.7pythonX.Y에 심볼릭 링크 또는 pythonX에 심볼릭 링크는 일반적입니다.)

전체 경로 하드 코딩 할 필요는이 다를 수 있으므로 없습니다

distro to distribro 또는 box to box.

그러나 경로가 python2.7 인 실행 파일에 대한 모호성이 없어야하므로 하드 코딩 경로에 대해 걱정할 필요없이 잘 수행 할 수 있습니다.

는 다른 방법으로, 첫 번째 스크립트 내에서, 당신은 같이 직접 파이썬 인터프리터를 호출 할 수 있습니다

subprocess.Popen(['pythonX.Y', SCRIPT_NAME]) 

대신

편집 JF 세바스챤 코멘트에 지적으로

subprocess.Popen([SCRIPT_NAME]) 

의, 첫 x 째 인수에 sys.executable을 사용하여 두 x 째 스크립트가 첫 번째 스크립트와 동일한 인터프리터로 전달되었는지 확인할 수 있습니다. 또는 유용하지 않을 수 있습니다, 당신은

import sys 
print(sys.hexversion) 

에 의해 스크립트 내부에서 "현재"파이썬 인터프리터 의 버전에 액세스 할 수 있습니다 예를 들어 보조 노트로

subprocess.Popen([sys.executable, SCRIPT_NAME]) 

유용 할 수있다 올바른 인터프리터가 실행 중인지 확인하십시오.

+0

@jedwards 특정 shebang이 작동하지 않아 아파치에서 잘못된 경로 오류가 발생했습니다. – Volatil3

3

먼저 #!/bin/envpython2.7 경로로 직접 변경하십시오 (예 : #!/usr/local/bin/python2.7).

ln -s /bin/python2.7 /usr/local/bin/python2.7 

그것은 잘 작동해야하는 경우 시스템 A와 B의 python2.7 경로에서

당신은 항상이 같은 심볼릭 링크를 만들 수 있습니다 (귀하의 경우 것 같다) 다른 장소에 있습니다. 당신은 예를 들어 2.7를 들어, 특정 파이썬 버전을 필요로하는 스크립트가있는 경우

2

왜 virtualenv를 사용하지 않습니까? 그것은 ... 당신이 (다른 것들 외에) 설치된 파이썬 버전을 사용할 수 있습니다

starenka /tmp % virtualenv test -ppython2.6 
Running virtualenv with interpreter /usr/bin/python2.6 
New python executable in test/bin/python2.6 
Also creating executable in test/bin/python 
Installing setuptools............................done. 
Installing pip...............done. 

starenka /tmp % source test/bin/activate 

(test)starenka /tmp % which python 
/tmp/test/bin/python 

(test)starenka /tmp % python --version 
Python 2.6.8 

(test)starenka /tmp % echo '#!/usr/bin/env python\nimport sys; print sys.version_info' > test/test.py 

(test)starenka /tmp % chmod +x test/test.py 

(test)starenka /tmp % test/test.py 
(2, 6, 8, 'final', 0) 

starenka /tmp % virtualenv test7 -ppython2.7 
Running virtualenv with interpreter /usr/bin/python2.7 
New python executable in test7/bin/python2.7 
Also creating executable in test7/bin/python 
Installing setuptools............done. 
Installing pip...............done. 
starenka /tmp % source test7/bin/activate 

(test7)starenka /tmp % which python 
/tmp/test7/bin/python 

(test7)starenka /tmp % python --version 
Python 2.7.3rc2 

(test7)starenka /tmp % echo '#!/usr/bin/env python\nimport sys; print sys.version_info' > test7/test.py 

(test7)starenka /tmp % chmod +x test7/test.py 

(test7)starenka /tmp % test7/test.py 
sys.version_info(major=2, minor=7, micro=3, releaselevel='candidate', serial=2) 
0

바보 필요한 경우, 쉘에서

간단한 :

ln -s /path/to/your/python2.X /usr/local/bin/python2 

파이썬에서 스크립트 :

#!/bin/bash 
"exec" "python2" "$0" 

나는이 종류의 프로를 겪어왔다. 이 솔루션은 대부분의 경우를 해결했으며 한 시스템에서 다른 시스템으로 쉽게 이식 할 수있었습니다 (시스템 간, 소프트웨어 버전 별 ...). 먼저 파이썬의 올바른 버전을 실행할 수 있도록 심볼릭 링크를 만드십시오. (파이썬 3이 파이썬 일 경우 지금은 절대 그렇지 않습니다.) 그리고 bash 환경에 의존하십시오. 따라서 패키지의 번거 로움을 요구하지 않는 util-script를 위해 시스템을 목표로 할 때마다 스크립트를 변경하지 마십시오.