5

システムには Python 2.6 がインストールされています。

Python 2.7 で導入されたモジュールを使用したいと考えています。root 権限がないため、ホーム ディレクトリ ($HOME/local/) に 2.7 をビルドしてインストールしました。

$HOME/.bashrc に以下を追加しました。

export PATH=$HOME/local/bin:$PATH
export PYTHONPATH=$HOME/local/lib/python2.7:$PYTHONPATH

今、回避策を求めたい2つの問題に遭遇しました。

1. Python 2.7 の起動

新しくインストールされた Python 2.7 は、システムのライブラリ パス (/usr/lib/python2.6/site-packages/) で 2.6 モジュールを検出しません。

手動で PYTHONPATH に追加する必要がありますか? より良い解決策はありますか?

2. Python 2.6 の起動

Python 2.6 は起動時に文句を言います:

'import site' failed; use -v for traceback

2.7 モジュール ($HOME/local/lib/python2.7) をロードしようとしていると思います。Python 2.6 が呼び出されたときに 2.6 モジュールのみをロードすることは可能ですか?

ありがとう。

4

3 に答える 3

4

1) python 2.7 の呼び出し

要するに:これをしないでください。パスが「/usr/lib/python* 2.6 */site-packages/」と呼ばれるのには理由があります。

理由の 1 つは、通常、このディレクトリには「コンパイル済み」の python ファイル (.pyc) が格納されていることです。Python 2.6 と Python 2.7 の .pyc ファイルには互換性がありません。

$ python2.7 /usr/lib/python2.6/sitecustomize.pyc
RuntimeError: Bad magic number in .pyc file

python は、理解できない pyc ファイルをスキップしますが、少なくともプリコンパイル済みファイルの利点は失われます。

別の理由は、物事が混乱する可能性があることです。

$ strace -f python2.7 /usr/lib/python2.6/sitecustomize.py
...
stat("/etc/python2.6", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/etc/python2.6", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/etc/python2.6/apport_python_hook", 0x7fffa15601f0) = -1 ENOENT (No such file or directory)
open("/etc/python2.6/apport_python_hook.so", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/python2.6/apport_python_hookmodule.so", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/python2.6/apport_python_hook.py", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/python2.6/apport_python_hook.pyc", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib/python2.7/apport_python_hook", 0x7fffa15601f0) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.7/apport_python_hook.so", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.7/apport_python_hookmodule.so", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.7/apport_python_hook.py", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.7/apport_python_hook.pyc", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib/python2.7/plat-linux2/apport_python_hook", 0x7fffa15601f0) = -1 ENOENT (No such file or directory)
...

あなたの場合、python2.7ディレクトリにpython 2.7にも必要なモジュールをインストールします。

2) python 2.6 の呼び出し

PYTHONHOME が記述されている man ページの部分を確認することをお勧めします。

PYTHONHOME: 標準の Python ライブラリの場所を変更します。デフォルトでは、ライブラリは ${prefix}/lib/python[version] と ${exec_prefix}/lib/python[version] で検索されます。ここで、${prefix} と ${exec_prefix} はインストールに依存するディレクトリであり、どちらもデフォルトです/usr/local へ

Python 2.7 固有のファイル/モジュールを、ローカル インストールの適切なディレクトリに保存できます。これらのファイル/モジュールは、特定のバージョンの python を実行したときにのみ取得されます。この場合、PYTHONPATH (または PYTHONHOME) を設定してはなりません。

注: これは、Debian (およびおそらく他のディストリビューション) が同時にインストールされた異なるバージョンの Python を管理する方法とまったく同じです。

[編集: niboshi からのコメントを受けて、セクション 1 を追加しました。]

于 2012-03-04T08:27:12.763 に答える
2

起動時にPythonはPYTHONPATH環境変数を受け取り、それを変数に入れsys.pathます。モジュールをインポートしようとすると、次のパスが検索されます。sys.path

のため:

export PYTHONPATH=$HOME/local/lib/python2.7:$PYTHONPATH

Python 2.7のパスは、sys.pathPython 2.6のパスの前の最初にあります(print sys.path確認できます)。つまり、から$HOME/local/lib/python2.7のモジュールが優先されます。

一部のスクリプトのパスをカスタマイズするには、スクリプトPYTHONPATHごとに設定するか、(インポートが実行される前にスクリプト内で)変更sys.pathsys.path.insert(0, '/home/user/local/lib/python2.7')ます。

または、特定のモジュールを別の名前でプロジェクトにコピーします。たとえばcollections、Python 2.7からプロジェクトにasを使用してモジュールをコピーしcollections27.py、必要な場所でコピーOrderedDictしました。from collection27 import OrderedDict

Python 2.6が呼び出されたときに2.6モジュールのみをロードすることは可能ですか?

はい、そうですね。パスにPython2.6モジュールのみが含まれていることを確認してください。使用しないでください。

export PYTHONPATH=$HOME/local/lib/python2.7:$PYTHONPATH
于 2012-03-04T07:47:01.407 に答える
0

より簡単な代替手段としてpythonbrewをお勧めします。

pythonbrew をインストールしたら:

$ pythonbrew install 2.7.2
$ pythonbrew switch 2.7.2
于 2012-03-04T08:01:25.450 に答える