web-dev-qa-db-ja.com

特定のバージョンを使用するようにPythonスクリプトに指示する方法

Main.pyモジュールで(おそらく)使用するインタープリターをPythonに伝えるにはどうすればよいですか?つまり、特定のスクリプトでPythonのバージョン3を使用してプログラム全体を解釈する場合、どうすればよいですか?

ボーナス:これはvirtualenvにどのように影響しますか?自分のプログラム用にvirtualenvを作成してから、異なるバージョンのPythonを使用するように指示すると、競合が発生する可能性があると思いますか?

63
jesuis

スクリプトの先頭行を並べることができますが、これは./my_program.pyとして実行する場合にのみ機能します。

python my_program.pyとして実行する場合、which pythonが返すPythonバージョンが使用されます。

Re:では、virtualenvを使用します:virtualenv -p /usr/bin/python3.2またはPython実行可能ファイルを使用するために設定するもの。

40
Jon Clements

おそらくあなたが尋ねたとおりではありませんが、これは私のプログラムの最初に置くのに役立つと思います:

import sys

if sys.version_info[0] < 3:
    raise Exception("Python 3 or a more recent version is required.")
39
Gravity Grave

末尾にPythonのシリアル番号を持つShebang #!/usr/bin/python(コードの最初の行)を使用します;)

LinuxコマンドラインからPythonを実行する場合も同じです。

16
Andrew

OPは* nixプラットフォームで動作している可能性がありますが、この回答は* nix以外のプラットフォームで役立ちます。 Microsoft Windowsでのシバンアプローチの仕事は経験していません。

言い換え:Shebang行は、「私のスクリプト内」という質問に答えますが、Unixライクなプラットフォームのみを信じています。スクリプトの外部のUnixシェルであるにもかかわらず、実際にShebang行を解釈して、どのバージョンのPythonインタープリターを呼び出すかを決定します。よくわかりませんが、Microsoft Windowsプラットフォームのユーザーにとっては、解決策では問題を解決できないと思います。

Microsoft Windowsの世界では、Pythonの特定のバージョンごとに環境変数を設定せずに、特定のPythonバージョンを実行する方法を簡素化するには、単にpython.exeC:\ Python25\python.exe mymodule.pyまたはD:\ Python27\python.exeなど)実行するパスを含むmymodule.py

ただし、Pythonライブラリーの誤ったバージョンを指すPYTHONPATHおよびその他のPYTHON ...環境変数を考慮する必要があります。

たとえば、次のコマンドを実行できます。C:\ Python2.5.2\python.exe mymodule

それでも、環境変数は間違ったバージョンを指している場合があります。

PYTHONPATH = D:\ Python27

PYTHONLIB = D:\ Python27\lib

恐ろしい楽しみがたくさん!

したがって、Windowsでの非仮想環境の方法は、環境をセットアップし、パスでpython.exeをプレフィックスとして特定のPython実行可能ファイルを呼び出すバッチファイルを使用することです。この方法には、管理する必要がある追加の詳細があります。たとえば、アプリケーションの終了後にコンソールをそのまま使用したい場合は、「start」または「cmd.exe」コマンドのいずれかにコマンドライン引数を使用して「コンソール環境を保存および置換」します。

あなたの質問から、いくつかのPythonモジュールがあり、それぞれが特定のバージョンのPythonを期待していると思います。これは、subprocessモジュールを使用する起動モジュールを持つことにより、スクリプト内で解決可能かもしれません。 mymodule.pyを呼び出す代わりに、モジュールを呼び出すモジュールを呼び出します。おそらくlaunch_mymodule.py

launch_mymodule.py

import subprocess
if sys.argv[2] == '272':
  env272 = {
    'PYTHONPATH': 'blabla',
    'PYTHONLIB': 'blabla', }
  launch272 = subprocess.Popen('D:\\Python272\\python.exe mymodule.py', env=env272)

if sys.argv[1] == '252'
  env252 = {
    'PYTHONPATH': 'blabla',
    'PYTHONLIB': 'blabla', }
  launch252 = subprocess.Popen('C:\\Python252\\python.exe mymodule.py', env=env252)

私はこれをテストしていません。

12
DevPlayer

Pythonプログラム内でこれを行うことはできません。Shebangラインの場合、シェルが使用するバージョンを決定するためです。

シェバンラインでシェルを使用せずにpython myprogram.pyと入力する場合、pythonXXX myprogram.pyを入力するときにどのPythonバージョンを使用するかを明確に決定しない限り、デフォルトバージョンを使用します。 。

Pythonプログラムが実行されたら、プログラムを実行するために使用するPython実行可能ファイルを既に決定しています。

virtualenvはpythonバージョンと環境を分離するためのもので、特に競合を排除するために存在します。

1
user177800

WindowsでPythonのさまざまなバージョンを使用しながら、

この方法を使用してバージョンを切り替えています。

Shebangsやvirtualenvをいじるよりも良いと思う

1)希望するpythonバージョンをインストールします

2)環境変数> PATHに移動します

(pythonバージョンのパスがEnv.Vars。> PATHに既に追加されていると仮定します)

3)使用したくないすべてのpythonバージョンのパスを抑制します

(パスを削除せず、「_ sup」などのサフィックスを追加するだけです)

4)ターミナルからpythonを呼び出します

(したがって、Windowsは変更した間違ったパスをスキップし、抑制していないパスでpython.exeを見つけ、その後このバージョンを使用します)

5)サフィックスを使ってバージョンを切り替える

0
GMG