在其他用户下执行脚本时,没有名为numpy_pickle的模块 - python

我有一个使用sklearn joblib加载持久模型并执行预测的python脚本。当我使用用户名运行脚本时,该脚本运行良好;当其他用户尝试运行相同的脚本时,该脚本将显示错误“ ImportError:No numpy_pickle模块”

我还将该脚本复制到了另一个用户主目录,并从那里运行它,仍然出现同样的错误,我也从python shell运行了它,没有任何改变。这是我在Python shell中运行的内容:

from sklearn.externals import joblib
joblib.load("model_filename.pkl")

上面的第二行在我的用户名下起作用,并在所有其他用户下给出以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/pymodules/python2.7/joblib/numpy_pickle.py", line 424, in load
    obj = unpickler.load()
  File "/usr/lib/python2.7/pickle.py", line 858, in load
    dispatch[key](self)
  File "/usr/lib/python2.7/pickle.py", line 1090, in load_global
    klass = self.find_class(module, name)
  File "/usr/lib/python2.7/pickle.py", line 1124, in find_class
    __import__(module)
ImportError: No module named numpy_pickle

这一切都通过Ubuntu 14.04.1 LTS在服务器上运行。

任何想法为什么会这样?

谢谢

python大神给出的解决方案

正如Croad Langshan所建议的那样,请确保您没有Joblib版本冲突/不匹配-我遇到了完全相同的问题。该二进制文件是使用sklearn.externals.joblib创建的,但是我使用的是从官方debian存储库中安装的独立joblib,这与库存debian sklearn结合使用会导致无法选择的二进制存储。

因此,请检查是否已将python-joblib作为独立软件包安装,如果有,请-删除它,删除sklearn并从源代码重新安装sklearn

$ sudo apt-get remove python-joblib
$ sudo apt-get remove python-sklearn

从源代码安装sklearn

$ git clone https://github.com/scikit-learn/scikit-learn.git
$ sudo python setup.py install

*注意-可能会发生冲突的情况(使用独立joblib创建的原始二进制文件)

*解决模块版本冲突/不匹配的更精细的解决方案是使用virtualenv,但就我而言,我没有动力保留独立的joblib