由于导入错误,无法同时运行python 2和3



我正试图在一台我没有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

相关内容

  • 没有找到相关文章

最新更新