【问题标题】:PYTHONPATH affecting BASH search pathPYTHONPATH 影响 BASH 搜索路径
【发布时间】:2016-03-29 16:55:57
【问题描述】:

在相对干净的 Ubuntu 15.04 桌面系统上使用 Anaconda 2.5.0 (python 2.7),我有以下异常行为:

如果我用 cx_Freeze 4.3.4 打包我的应用程序并将 bin 目录添加到 PYTHONPATH 环境变量中:

export PYTHONPATH=~/frozen-app/bin

然后,当我输入错误的 bash 命令时:

sl

而不是预期的:

The program 'sl' is currently not installed. You can install it by typing:
sudo apt-get install sl

我得到一个 python 堆栈跟踪:

Traceback (most recent call last):
  File "/usr/lib/command-not-found", line 23, in <module>
    import gettext
  File "/usr/lib/python3.4/gettext.py", line 49, in <module>
    import locale, copy, io, os, re, struct, sys
  File "/usr/lib/python3.4/locale.py", line 18, in <module>
    import collections
  File "/usr/lib/python3.4/collections/__init__.py", line 11, in <module>
    from operator import itemgetter as _itemgetter, eq as _eq
ImportError: dynamic module does not define init function (PyInit_operator)
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 62, in apport_excepthook
    import re, traceback
  File "/usr/lib/python3.4/traceback.py", line 3, in <module>
    import linecache
  File "/usr/lib/python3.4/linecache.py", line 10, in <module>
    import tokenize
  File "/usr/lib/python3.4/tokenize.py", line 29, in <module>
    import collections
  File "/usr/lib/python3.4/collections/__init__.py", line 11, in <module>
    from operator import itemgetter as _itemgetter, eq as _eq
ImportError: dynamic module does not define init function (PyInit_operator)

Original exception was:
Traceback (most recent call last):
  File "/usr/lib/command-not-found", line 23, in <module>
    import gettext
  File "/usr/lib/python3.4/gettext.py", line 49, in <module>
    import locale, copy, io, os, re, struct, sys
  File "/usr/lib/python3.4/locale.py", line 18, in <module>
    import collections
  File "/usr/lib/python3.4/collections/__init__.py", line 11, in <module>
    from operator import itemgetter as _itemgetter, eq as _eq
ImportError: dynamic module does not define init function (PyInit_operator)

似乎“command-not-found”命令被我的 PYTHONPATH 环境弄糊涂了,但我不知道具体原因。我认为我的应用程序中没有定义任何提到的模块(例如,我没有在我的应用程序中定义“re”模块)。

如果我运行“strace sl”,那么我只会得到“can't stat sl”。有没有其他方法可以准确地确定我的应用程序中的哪个文件导致了这种情况?

【问题讨论】:

    标签: python-2.7 python-3.x anaconda


    【解决方案1】:

    使用上面 Charles Duffy 的建议,并更仔细地查看 python 堆栈跟踪,我能够重现错误:

    python3.4 -m operator
    

    这就是复制堆栈跟踪。由于我的 PYTHONPATH 指向来自 Anaconda2.5(python 2.7)的 bin 目录,因此 python3.4 似乎试图从已冻结在我的 bin 目录中的 anaconda 发行版加载 operator.so。此特定导入失败。从我的 bin 中删除 operator.so 可以解决此问题。似乎使用系统 python3.4(由 command-not-found 使用)和 Anaconda 2.7 结合显式设置 PYTHONPATH 可能会导致麻烦。

    【讨论】:

      猜你喜欢
      • 2018-09-16
      • 1970-01-01
      • 2015-05-16
      • 2012-06-07
      • 2016-06-03
      • 2016-08-09
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多