91

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

おまけ: これは virtualenv にどのように影響しますか? プログラムの virtualenv を作成し、別のバージョンの Python を使用するように指示すると、競合が発生する可能性があると考えるのは正しいですか?

4

8 に答える 8

73

スクリプトの先頭にシバン行を追加できます。

#!/usr/bin/env python2.7

ただし、それは as として実行する場合にのみ機能し./my_program.pyます。

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

re: to virtualenv use:virtualenv -p /usr/bin/python3.2または、その Python 実行可能ファイルを使用するように設定するもの。

于 2012-06-23T17:05:23.463 に答える
60

おそらくあなたが尋ねたものとは正確には異なりますが、これは私のプログラムの最初に置くと便利だと思います:

import sys

if sys.version_info[0] < 3:
    raise Exception("Python 3 or a more recent version is required.")
于 2017-01-27T19:49:25.587 に答える
22

最後にPythonのシリアル番号が付いたシバン (コードの最初の行)を使用し#!/usr/bin/pythonます;)

次に、Python ファイルをスクリプトとして実行します。たとえば、./main.pyコマンド ラインからではなく、python main.py.

Linux コマンドラインから Python を実行したい場合も同様です。

于 2012-06-23T16:15:44.577 に答える
16

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

言い換えると、シバン行は「スクリプト内」の質問に答えますが、Unix のようなプラットフォームに対してのみだと思います。スクリプトの外部にある Unix シェルですが、実際にシバン行を解釈して、呼び出す Python インタープリターのバージョンを決定します。確かではありませんが、このソリューションでは Microsoft Windows プラットフォーム ユーザーの問題は解決しないと思います。

Microsoft Windows の世界では、インストールされている Python の特定のバージョンごとに特別に環境変数を設定せずに、特定の Python バージョンを実行する方法を簡素化するには、python.exeの前に実行したいパスを次のように付けます。 C:\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 では、virtualenv 以外の方法として、環境をセットアップし、python.exeの前にそれが存在するパスを付けて特定の Python 実行可能ファイルを呼び出すバッチ ファイルを使用することになります。この方法には、追加の詳細があります。ただし、管理します。アプリケーションの終了後もコンソールを固定したい場合は、「start」コマンドまたは「cmd.exe」コマンドのいずれかのコマンドライン引数を使用して「「コンソール」環境を保存して置き換える」などです。

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

launch_mymodule.py

import sys
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)

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

于 2012-06-23T18:56:21.997 に答える
0

pyenv を使用して仮想環境を制御している場合、これがスクリプトで機能することがわかりました。

#!/home/<user>/.pyenv/versions/<virt_name>/bin/python

DO_STUFF
于 2020-11-21T01:45:38.367 に答える
0

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

シバン行でシェルを使用しておらず、入力python myprogram.pyするだけの場合、使用するバージョンを入力するときにどの Python バージョンを具体的に決定しない限り、デフォルト バージョンpythonXXX myprogram.pyが使用されます。

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

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

于 2012-06-23T15:48:02.000 に答える