PYTHONPATH 影响 BASH 搜索路径
PYTHONPATH affecting BASH search path
在相对干净的 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"。是否有另一种方法可以准确找出我的应用程序中的哪个文件导致此问题?
使用上面 Charles Duffy 的建议,并更仔细地查看 python 堆栈跟踪,我能够重现错误:
python3.4 -m operator
这就是复制堆栈跟踪。由于我的 PYTHONPATH 指向来自 Anaconda2.5 (python 2.7) 的 bin 目录,似乎 python3.4 试图从已冻结的 anaconda 发行版加载 operator.so在我的 bin 目录中。此特定导入失败。从我的垃圾箱中删除 operator.so 解决了这个问题。似乎使用系统 python3.4(由 command-not-found 使用)和 Anaconda 2.7 结合显式设置 PYTHONPATH 可能会导致麻烦。
在相对干净的 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"。是否有另一种方法可以准确找出我的应用程序中的哪个文件导致此问题?
使用上面 Charles Duffy 的建议,并更仔细地查看 python 堆栈跟踪,我能够重现错误:
python3.4 -m operator
这就是复制堆栈跟踪。由于我的 PYTHONPATH 指向来自 Anaconda2.5 (python 2.7) 的 bin 目录,似乎 python3.4 试图从已冻结的 anaconda 发行版加载 operator.so在我的 bin 目录中。此特定导入失败。从我的垃圾箱中删除 operator.so 解决了这个问题。似乎使用系统 python3.4(由 command-not-found 使用)和 Anaconda 2.7 结合显式设置 PYTHONPATH 可能会导致麻烦。