2017-02-01 18 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') 

期待どおりのモジュールがリストされています。出力:私は次の行でPythonのバージョンを確認するとき

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 

は今、それはまだのpython 2.6.6

print(sys.version) 

出力されます:

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を使用するか?

注:スクリプトをロードする前にバージョンを変更できます。しかし、それは複数のユーザーによって使用され、私はrootアクセス権を持っていません。だから、すべてのバージョンを変更することはできません。そして、私はそれをこの方法でのみ行うことに興味があります。

+0

「#!utils/python/3.6.0」のように、あなたのスクリプトに適切なシバン行を与えることができないのはなぜですか? –

+1

私は別の場所にpythonをインストールしたので、この場所からbinとlibファイルを指す必要があります。私はこれを行うために環境モジュールを使用します。また、私はスクリプトでパスをハードコードしたくありません。 – Jarvis

+1

Pythonのバージョンをチェックして、別のインタプリタでスクリプトを再実行するとどうなりますか?また、 'sys.version_info.major == 2:... 'のように、' sys.version_info'を使ってバージョンチェックを簡単にすることができると思います。 – TidB

答えて

1

最新のコメントでは、「ここでDOC」の使用を暗唱しました。 Pythonの中では、これらを「ドキュメンテーション文字列」と呼ばれ、3重引用符(「」 ")として書かれている次のようにあなたの問題に関しては、彼らが使用することができます。

#!/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" 

私のマシン(Ubuntuの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 

(バージョンがマシンに異なる場合があります。)

お知らせ二つのこと:

  • バージョン番号2. * 3. *
  • への変更プロセスIDは、execの後に同じ3085
  • 行が実行されていないまま。実際、execコマンドはPython 2インタプリタを「アンロード」します。もはや残りのファイルを実行することはありません。

いくつかの定義では、これは「Python 2. *を3. *に変更する」と考えることができます。同じ方法を使用して、2.6.6から3.6.0に変更することができます。

最後に、注意してください。あなたのニーズが悲惨でない限り、私はに対してに対して上記のテクニックを使用することをお勧めします。次の制限が適用される場合があります。

  • execの動作はプラットフォームによって大きく異なります。
  • 最大argサイズ(Python 3文字列のサイズ)は、カーネルにハードコードされています。それは数キロバイト程度の小さなものでもよい。
  • 最後に、大部分のスクリプトをdocstring内に配置していることがわかりました。
+0

@ TidBのコメントを "文字列に実際のロジックを入れてexecしてください。この答えはアイディアの拡大です。 – Ryan

関連する問題