在不同用户下执行脚本时,没有名为numpy_pickle的模块

时间:2015-03-01 19:04:57

标签: python scikit-learn joblib

我有一个python脚本,它使用sklearn joblib来加载持久模型并执行预测。当我在用户名下运行脚本时,脚本运行正常,当其他用户尝试运行相同的脚本时,他们会收到错误" ImportError:没有名为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的服务器。

为什么会发生这种情况?

谢谢

3 个答案:

答案 0 :(得分:3)

根据Croad Langshan的建议,确保您没有 joblib版本冲突/不匹配 - 我遇到了完全相同的问题。二进制文件是使用 sklearn.externals.joblib 创建的,但是我使用的是从offical debian存储库安装的独立的joblib ,这与stock 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

答案 1 :(得分:1)

加载函数正在使用Python标准库模块pickle&#34;引擎盖&#34;。该模块提供了将任意python对象转储到文件的方法。 &#34;取储存&#34;该文件再次将python对象从文件加载回内存需要Python文件定义模块中的对象&#39;定义了类(函数也是如此)。包含这些模块的目录需要在sys.path上(比如在环境变量PYTHONPATH中列出)。

可能有问题的腌菜引用了模块numpy_pickle中的代码(而不是joblib.numpy_pickle),也许这不在sys.path上(即使joblib本身就是)。尝试(在导入之前)运行import cgitb; cgitb.enable()以查看最后一个堆栈框架中module的值。

答案 2 :(得分:0)

我有同样的问题。我用一个用户腌制了一个模型,并且不能用第二个用户取消它。以上答案并没有真正帮助我。 我认为它与保存在pickle文件中的局部变量和第二个用户的路径有关。

该模块正在尝试加载为:

__import__('joblib.numpy_pickle')

导致

ImportError: No module named joblib.numpy_pickle

但如果你跑

__import__('sklearn.externals.joblib.numpy_pickle')

它可以找到并返回

<module 'sklearn' from '/python2.6/site-packages/sklearn/__init__.pyc'>

所以我假设第二个用户正在尝试加载文件,文件中有一些设置告诉它查看joblib.numpy_pickle并忽略之前导入的sklearn.externals。我不知道如何解决这个问题,所以我只是再次与第二个用户一起训练模型并保存。现在第二个用户可以读取它创建的文件。