【问题标题】:Cannot simultaneously run python 2 and 3 due to import errors由于导入错误,无法同时运行 python 2 和 3
【发布时间】:2015-09-16 16:10:39
【问题描述】:

我试图能够在我没有 root 访问权限且最近没有 python3 实现的服务器上同时运行 python2 和 python3。这在我自己的服务器上运行良好,我确实有 root 访问权限,但我无法弄清楚我做错了什么。

作为参考,管理员已在相关的 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 代码时,问题就出现了。

我在 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 中,但现在 python3 似乎完全忽略了 PYTHON3PATH 并且只使用了 PYTHONPATH。

同样,这个问题不会出现在我自己的个人服务器上,它运行 arch linux 并且 python 3.4 和 python 2.7 愉快地并排运行,即使我的 PYTHONPATH 包含两者的目录。

我确定我在这里做了一些愚蠢的事情,但我不知道那是什么。


1脚注避免愚蠢的cmets:他们的python2脚本不是我写的,python3代码是一个简单的作业管理系统,可以在远程机器上协调多线程非并行代码。它应该并行运行任何独立程序,但使用 python2 脚本失败。所以我不能只将一个或另一个切换到版本 2 或 3,也不能通过使用 2to3 和导入来合并两者。

【问题讨论】:

  • 为什么你发现将 PYTHONPATH 设置为 python2 以执行 python2 是“非常麻烦和丑陋的”?对我来说,这似乎是一个简单而正确的解决方案。
  • @antont 原因是我写的脚本是在远程服务器上运行的,python 路径很复杂,其他人使用这个脚本。服务器有一个 Rocks 模块系统,因此我们要在我正在执行的 python2 代码中使用一些生物信息学模块,我必须获取 3 个模块,python2 路径最终有 6 个条目,长度为 417 个字符。我必须每次并且仅在运行 python2 代码时手动添加它。这是很多工作,并且涉及硬编码或将很长的字符串作为参数传递。如果可以避免的话,我不喜欢这个主意。
  • 如果您可以将路径作为配置设置(或者像您说的那样在代码中很好地硬编码),我看不出它有多少条目或多少个字符有多重要它是。即使您知道兆字节,计算机也可以轻松处理 :) 因此,鉴于您可以将该 conf 放在某个地方并使用它,而无需手动执行任何操作,它对我来说仍然是一个不错的解决方案。我当然不是建议您一直手动输入它。当然也可以有其他选项,我不知道岩石等。
  • 也许将 PYTHON3PATH 处理添加到 python3 site.py?

标签: python linux python-2.7 python-3.x rocks


【解决方案1】:

使用显式路径或版本调用 python 解决了该问题。例如:

$ python3.x
$ path_to/python

【讨论】:

  • 是的,现在效果很好。我已经使用这种方法几个月了,没有任何问题。我还学习了如何在我正在使用的集群上使用 Rocks 模块系统,这让整个事情变得更加简单,但它只适用于基于 Rocks 的集群。
  • @Mike Environment Modules at modules.sourceforge.net 也适用于 linux 和集群。
猜你喜欢
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 2020-03-19
  • 2020-03-13
  • 1970-01-01
  • 2015-06-02
相关资源
最近更新 更多