2017-02-01 3 views
4

스크립트 내에서 Python의 실행 버전을 변경할 수 있습니까?Python 스크립트 내에서 Python 실행 버전을 변경하십시오.

기본적으로로드되는 Python 2.6.6이 있습니다. 이 버전을 3.6.0으로 변경하고 싶습니다.이 버전은 스크립트 내부의 사용자 정의 위치 (/ usr/bin 아님)에 설치됩니다. 따라서 스크립트에서 sys.version으로 Python 버전을 확인하고 Python 3.6.0 모듈을 스크립트에로드합니다. 실행 환경에 반영되지 않습니다. 코드는 다음과 같습니다.

import sys, os 
pyVersion = int(sys.version.split(" ")[0].replace(".", "")) 
exec(open(os.environ['MODULESHOME']+"/init/python.py").read()) 
if pyVersion < 360: 
    print("Python 3.6.0 version required") 
    print("Loading utils/python module") 
    module(['load', 'utils/python/3.6.0']) 
    module('li') 

예상대로 모듈을 나열합니다. 출력 : 이제

2.6.6 (r266:84292, Jul 23 2015, 15:22:56) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] 

, 어떻게 파이썬을 만들 수 있습니다 : 나는 다음 라인에서 파이썬 버전을 확인할 때 이제

Python 3.6.0 version required 
Loading utils/python module 
Currently Loaded Modulefiles: 
1) licenses     2) cliosoft/6.32.p3(default) 3)utils/python/3.6.0 

은, 그것은

print(sys.version) 

출력 여전히 파이썬 2.6.6입니다 모듈을로드 한 후 모든 코드 행에 3.6.0을 사용 하시겠습니까?

참고 : 스크립트를로드하기 전에 버전을 변경할 수 있습니다. 그러나, 그것은 여러 사용자에 의해 사용되며 루트 액세스 권한이 없습니다. 따라서 모든 버전에 대해 버전을 변경할 수는 없습니다. 그리고 나는 이렇게하는 것에 만 관심이 있습니다.

+0

'#! utils/python/3.6.0'과 같이 적절한 스크립트를 줄 수없는 이유는 무엇입니까? –

+1

다른 위치에 파이썬을 설치 했으므로이 위치에서 bin 및 lib 파일을 가리켜 야합니다. 나는 이것을하기 위해 환경 모듈을 사용한다. 또한 스크립트에서 경로를 하드 코딩하지 않으려합니다. – Jarvis

+1

파이썬 버전을 확인하고 다른 인터프리터로 스크립트를 다시 실행하면 어떨까요? 또한,'sys.version_info.major == 2 : ... '와 같이'sys.version_info'를 사용하여 버전 검사를 더 쉽게 할 수 있다고 생각합니다. – TidB

답변

1

최근 의견에서 "여기에 DOC"사용법을 언급했습니다. . 다음과 같이 파이썬 내에서 이러한 '가 문서화 문자열'라고하며 문제에 관련하여 세 가지 따옴표 ("" ")로 작성, 그들은 사용할 수 있습니다 : 내 컴퓨터에

#!/usr/bin/env python 

# Python 2 
import os 
import sys 
print "1. Python version: ", sys.version 
print "2. Process id: ", os.getpid() 

os.execlp("python3", "python3", "-c", """ 

# Python 3 
import os 
import sys 
print("3. Python version: ", sys.version) 
print("4. Process id: ", os.getpid()) 
""") 

print "5. Does not execute" 

(우분투 16.04)에 출력은 다음과 같습니다

1. Python version: 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] 
2. Process id: 3085 
3. Python version: 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] 
4. Process id: 3085 

(버전이 컴퓨터에 다를 수 있습니다.)

주의 사항 두 가지 :

  • 버전 번호 3. *
  • 프로세스 ID 2. * 변경 사항이 실행되지 않습니다 간부 인 후 같은 3085
  • 라인을 남아있다. 사실 exec 명령은 파이썬 2 인터프리터를 "언로드"합니다. 더 이상 파일의 나머지 부분을 실행하는 것이 아닙니다.

어떤 정의에 따르면, 이것은 "Python 2. *을 3으로 변경"*으로 간주 될 수 있습니다. 같은 방법을 사용하여 2.6.6에서 3.6.0으로 변경할 수 있습니다.

마지막으로주의하십시오. 귀하의 요구가 무서운 경우가 아니면 위의 기술을 사용하여에 대해 을 권장합니다. 다음과 같은 제한이 적용될 수 있습니다.

  • exec의 동작은 플랫폼에 따라 크게 다릅니다.
  • 최대 arg 크기 (Python 3 문자열의 크기)는 커널에 하드 코딩되어 있습니다. 그것은 수 킬로바이트만큼 작을 수 있습니다.
  • 그리고 마침내 나는 docstring 안에 대다수의 스크립트를 넣는 것을 발견했다.
+0

나는 @ TidB의 코멘트를 읽었다. "실제의 논리를 문자열에 넣고 exec하면된다. 나는 그것으로부터 멀리 떨어져있게 강하게 권하고 싶다." 이 대답은 아이디어의 확장입니다. – Ryan

관련 문제