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

Python 在不同用户下执行脚本时,没有名为numpy_pickle的模块,python,scikit-learn,joblib,Python,Scikit Learn,Joblib,我有一个python脚本,它使用sklearn-joblib加载一个持久模型并执行预测。当我以我的用户名运行脚本时,脚本运行正常,当其他用户尝试运行相同的脚本时,他们会收到错误“ImportError:没有名为numpy_pickle的模块” 我还将脚本复制到另一个用户主目录,并从那里运行它,但仍然存在相同的错误,我也从PythonShell运行它,没有任何更改。以下是我在Python shell中运行的内容: from sklearn.externals import joblib jobli

我有一个python脚本,它使用sklearn-joblib加载一个持久模型并执行预测。当我以我的用户名运行脚本时,脚本运行正常,当其他用户尝试运行相同的脚本时,他们会收到错误“ImportError:没有名为numpy_pickle的模块”

我还将脚本复制到另一个用户主目录,并从那里运行它,但仍然存在相同的错误,我也从PythonShell运行它,没有任何更改。以下是我在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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
加载文件“/usr/lib/pymodules/python2.7/joblib/numpy_pickle.py”,第424行
obj=取消勾选器加载()
文件“/usr/lib/python2.7/pickle.py”,第858行,已加载
调度[键](自身)
文件“/usr/lib/python2.7/pickle.py”,第1090行,在load\u global中
klass=self.find_类(模块,名称)
文件“/usr/lib/python2.7/pickle.py”,第1124行,在find_类中
__导入(模块)
ImportError:没有名为numpy\u pickle的模块
这一切都是运行一个带有Ubuntu 14.04.1 LTS的服务器

知道为什么会这样吗


谢谢

加载函数正在使用Python标准库模块
pickle
“引擎盖下”。该模块提供了将任意python对象转储到文件的方法。再次“取消勾选”该文件以将python对象从该文件加载回内存需要定义对象类所在模块的python文件(函数也是如此)。包含这些模块的目录需要位于
sys.path
(例如,通过在环境变量
PYTHONPATH
中列出的方式)


可能所讨论的pickle引用了模块
numpy\u pickle
(与
joblib.numpy\u pickle
)中的代码,并且可能它不在
sys.path
上(即使
joblib
本身是)。尝试(导入前)运行
import cgib;cgib.enable()
查看最后一个堆栈帧中的
模块的值。

正如Croad Langshan建议的那样,确保没有joblib版本冲突/不匹配-我遇到了完全相同的问题。二进制文件是用sklearn.externals.joblib创建的,但我使用的是从官方debian存储库安装的独立joblib,这与stock debian sklearn结合在一起,形成了一个不可访问的二进制存储

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

$ sudo apt-get remove python-joblib
$ sudo apt-get remove python-sklearn
$ git clone https://github.com/scikit-learn/scikit-learn.git
$ sudo python setup.py install
安装sklearn from source

$ sudo apt-get remove python-joblib
$ sudo apt-get remove python-sklearn
$ git clone https://github.com/scikit-learn/scikit-learn.git
$ sudo python setup.py install
*注意-冲突发生逆转的情况是可能的(使用独立joblib创建的原始二进制文件)


*解决模块版本冲突/不匹配的更精细的解决方案是使用VirtualNV,但在我的情况下,我没有动力保留独立的joblib,我也遇到了同样的问题。我用一个用户对一个模型进行了pickle,但无法用第二个用户对其进行取消pickle。上面的答案并没有真正帮助我。 我相信这与保存在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。我不知道如何解决这个问题,所以我只是用第二个用户再次训练模型并保存它。现在第二个用户可以读取它创建的文件。

您好,我也遇到了这个问题,我还无法解决它。卸载软件包不是一个选项,因为数字取决于它们。另一方面,当我尝试虚拟环境方法(使用系统范围的软件包创建虚拟环境->激活venv->pip安装--忽略已安装的scikit学习(和joblib))时,我得到了完全相同的错误,可能是因为它发生在保持不变的“/usr/lib/python2.7/pickle.py”上。还有其他想法吗?