我正试图在一台我没有root访问权限、也没有最近的python3实现的服务器上同时运行python2和python3。这在我自己的服务器上运行得很好,我确实有root访问权限,但我不知道我做错了什么。
作为参考,python2的实现已经由管理员安装在有问题的centos/rocks系统上,他们有2.6.6和2.7.5版本。他们也安装了python 3.3.2,但我在3.4版本中使用了一些东西,所以我自定义安装了3.4.3版本,并将其放在我的PATH、LIBPATH和PYTHONPATH中。我将python版本专门用于我自己的代码,并在那里使用pip安装库。我为python3版本创建了自己的自定义rocks模块,该模块设置了PATH、LIBPATH和LD_LIBRARY_PATH。
当我只是运行python3代码时,一切都很好。当我尝试在同一会话中同时运行python3和python2代码时,问题就出现了。
我已经在python3中编写了代码,它进行系统调用来运行python2程序1。问题是,为了运行我的python3代码,我将PYTHONPATH设置为只包含python3。如果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中。但现在python4似乎完全忽略了PYTHON2PATH,只使用PYTHONPATH。
同样,这个问题不会发生在我自己的个人服务器上,它运行arch linux,python 3.4和python 2.7愉快地并排运行,尽管我的PYTHONPATH包含这两个目录。
我确信我在这里做了一些愚蠢的事情,但我不知道这是什么。
1避免愚蠢评论的脚注:python2脚本不是我写的,python3代码是一个简单的作业管理系统,可以在远程机器上协调多线程非并行代码。它应该并行运行任何独立的程序,但它在使用python2脚本时失败了。因此,我不能只将其中一个切换到版本2或版本3,也不能通过使用2to3和导入将两者合并。
使用显式路径或版本调用python解决了问题。例如:
$ python3.x
$ path_to/python