2

root アクセス権がなく、最近の python3 実装を持たないサーバーで python2 と python3 を同時に実行できるようにしようとしています。これは、ルートアクセス権を持っている自分のサーバーでは正常に機能しますが、何が間違っているのかわかりません。

参考までに、問題の centos/rocks システムには管理者によって python2 実装がインストールされており、バージョン 2.6.6 と 2.7.5 の両方があります。彼らは python 3.3.2 もインストールしましたが、バージョン 3.4 にもいくつか使用しているものがあるので、バージョン 3.4.3 をカスタム インストールして、PATH、LIBPATH、および PYTHONPATH に入れました。私はその python バージョンを自分のコード専用に使用し、そこにライブラリを pip でインストールします。PATH、LIBPATH、および LD_LIBRARY_PATH を設定する python3 バージョン用の独自のカスタム rocks モジュールを作成しました。

python3 コードを実行しているときは、すべて正常に動作します。問題は、同じセッションで python3 と python2 のコードを同時に実行しようとすると発生します。

python2 プログラムを実行するためのシステム コールを作成するコードを python3 で作成しました1。問題は、python3 コードを実行するために、python3 ライブラリのみを含むように PYTHONPATH を設定していることです。python2 ライブラリがその PATH にある場合、次のようなエラーが表示されます。

Failed to import the site module
Traceback (most recent call last):
  File "/opt/scipy/2.7/lib/python2.7/site-packages/site.py", line 73, in <module>
    __boot()
  File "/opt/scipy/2.7/lib/python2.7/site-packages/site.py", line 2, in __boot
    import sys, imp, os, os.path   
  File "/oasis/projects/nsf/sua137/peanut/usr/lib/python3.4/imp.py", line 22, in <module>
    from importlib import util
  File "/oasis/projects/nsf/sua137/peanut/usr/lib/python3.4/importlib/util.py", line 12, in <module>
    from contextlib import contextmanager
  File "/oasis/projects/nsf/sua137/peanut/usr/lib/python3.4/contextlib.py", line 4, in <module>
    from collections import deque
  File "/oasis/projects/nsf/sua137/peanut/usr/lib/python3.4/collections/__init__.py", line 17, in <module>
    from reprlib import recursive_repr as _recursive_repr
  File "/opt/biotools/qiime/lib/python2.7/site-packages/reprlib/__init__.py", line 8, in <module>
    raise ImportError('Cannot import module from python-future source folder')
ImportError: Cannot import module from python-future source folder

ただし、PYTHONPATH からすべての python2 を取り除くと、python2 スクリプトは次のようなエラーで失敗します。

File "/oasis/projects/nsf/sua137/peanut/usr/lib/python3.4/site.py", line 176
file=sys.stderr)
    ^
SyntaxError: invalid syntax

これを回避する唯一の方法は、python2 コードの呼び出しに明示的な PYTHONPATH を含めることです。それは機能しますが、非常に面倒で醜いです。

以前はすべての python3 のものを PYTHON3PATH に保持し、python2 のものを PYTHONPATH に保持していましたが、今では python3 は PYTHON3PATH を完全に無視し、PYTHONPATH のみを使用しているように見えます。

繰り返しますが、この問題は、私の PYTHONPATH に両方のディレクトリが含まれていても、arch linux を実行し、python 3.4 と python 2.7 を並行して実行している私自身の個人サーバーでは発生しません。

私はここで愚かなことをしていると確信していますが、それが何であるかはわかりません。


1ばかげたコメントを避けるための脚注: 彼らの python2 スクリプトは私が書いたものではありません。python3 コードは、リモート マシン上でマルチスレッドの非並列コードを調整する単純なジョブ管理システムです。任意のスタンドアロン プログラムを並行して実行することになっていますが、python2 スクリプトでは失敗しています。したがって、どちらか一方をバージョン 2 または 3 に切り替えることはできず、2to3 を使用してインポートして 2 つをマージすることもできません。

4

1 に答える 1