【发布时间】:2018-11-01 01:40:48
【问题描述】:
在 spyder (python 3.6.5) 上读取 .pkl 文件时出现以下错误:
IN: with open(file, "rb") as f:
data = pickle.load(f)
Traceback (most recent call last):
File "<ipython-input-5-d9796b902b88>", line 2, in <module>
data = pickle.load(f)
AttributeError: Can't get attribute 'Signal' on <module '__main__' from 'C:\\Python36\\lib\\site-packages\\spyder\\utils\\ipython\\start_kernel.py'>
上下文:
我的程序由一个文件组成:program.py
在程序中,定义了一个类Signal 以及许多函数。下面提供了该程序的简化概述:
import numpy as np
import _pickle as pickle
import os
# The unique class
class Signal:
def __init__(self, fq, t0, tf):
self.fq = fq
self.t0 = t0
self.tf = tf
self.timeline = np.round(np.arange(t0, tf, 1/fq*1000), 3)
# The functions
def write_file(data, folder_path, file_name):
with open(join(folder_path, file_name), "wb") as output:
pickle.dump(data, output, -1)
def read_file(folder_path, file_name):
with open(join(folder_path, file_name), "rb") as input:
data= pickle.load(input)
return data
def compute_data(# parameters):
# do stuff
函数compute_data会返回一个元组列表,格式如下:
data = [((Signal_1_1, Signal_1_2, ...), val 1), ((Signal_2_1, Signal_2_2, ...), val 2)...]
当然,Signal_i_k 是一个对象Signal。此列表将以 .pkl 格式保存。此外,我正在为compute_data 函数使用不同的参数进行大量迭代。许多迭代将使用过去的计算数据作为起点,因此将读取相应的和需要的 .pkl 文件。
最后,我同时使用多台计算机,每台计算机都将计算数据保存在本地网络上。因此,每台计算机都可以访问其他计算机生成的数据并将其用作起点。
回到错误:
我的主要问题是,当我通过双击文件或通过 windows cmd 或 PowerShell 启动程序时,我从未遇到此错误。该程序永远不会崩溃并抛出此错误并且运行时不会出现明显问题。
但是,我无法在 spyder 中读取 .pkl 文件。每次我尝试,都会抛出错误。
知道为什么我会出现这种奇怪的行为吗?
谢谢!
【问题讨论】:
-
您在 Spyder 中使用的 Python 版本可能与在命令行中使用的不同。你检查过版本号吗?
-
@IonicSolutions 你能告诉我如何正确地做到这一点吗?我认为这不是问题,因为我的笔记本电脑安装的唯一版本是 python 3.6.5。 Spyder 是使用 cmd 和命令行安装的:
py -3.6 -m pip install spyder。 (与同时安装了 python 2.7 的 2 个工作站的情况略有不同)。 -
import sysprint(sys.version)为您提供解释器使用的确切版本。 -
@IonicSolutions 正如预期的那样:
3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]
标签: python python-3.x pickle spyder