Python 如何在脚本运行之间存储对象?

Python 如何在脚本运行之间存储对象?,python,Python,我正在使用基于此的python脚本每小时提取个人财务信息 要连接到Mint,我需要Mint=mintapi.Mint(电子邮件,密码),它通过selenium打开一个Chrom实例并登录到Mint,并创建一个 要刷新信息,我只需要执行mint.initiate\u account\u refresh() 但每次我运行脚本时,它都会再次执行整个登录操作 我是否可以将mint对象以某种方式存储在磁盘上,这样我就可以跳过该步骤,只需刷新帐户 要在Python中存储对象,可以使用pickle模块 假设您

我正在使用基于此的python脚本每小时提取个人财务信息

要连接到Mint,我需要
Mint=mintapi.Mint(电子邮件,密码)
,它通过
selenium
打开一个Chrom实例并登录到Mint,并创建一个

要刷新信息,我只需要执行
mint.initiate\u account\u refresh()

但每次我运行脚本时,它都会再次执行整个登录操作

我是否可以将
mint
对象以某种方式存储在磁盘上,这样我就可以跳过该步骤,只需刷新帐户

要在Python中存储对象,可以使用
pickle
模块

假设您有一个对象
mint

import pickle
mint = Something.Somefunc()

with open('data.pickle','wb') as storage:
    pickle.dump(mint,storage)
该对象将以二进制字节序列的形式保存在名为
data.pickle
的文件中

要访问它,只需使用
pickle.load()
函数

import pickle

with open('data.pickle','rb') as storage:
    mint = pickle.load(storage)

>>>mint
>>><class 'something' object>
导入pickle
使用open('data.pickle','rb')作为存储:
薄荷=泡菜。装载(储存)
>>>造币厂
>>>
注意:

尽管这在这里无关紧要,但pickle模块有一个缺陷,即它可以在从文件加载函数对象时执行这些函数对象,因此从第三方源读取pickle存储的对象时不要使用它

要在Python中存储对象,可以使用
pickle
模块

假设您有一个对象
mint

import pickle
mint = Something.Somefunc()

with open('data.pickle','wb') as storage:
    pickle.dump(mint,storage)
该对象将以二进制字节序列的形式保存在名为
data.pickle
的文件中

要访问它,只需使用
pickle.load()
函数

import pickle

with open('data.pickle','rb') as storage:
    mint = pickle.load(storage)

>>>mint
>>><class 'something' object>
导入pickle
使用open('data.pickle','rb')作为存储:
薄荷=泡菜。装载(储存)
>>>造币厂
>>>
注意:

尽管这在这里无关紧要,但pickle模块有一个缺陷,即它可以在从文件加载函数对象时执行这些函数对象,因此从第三方源读取pickle存储的对象时不要使用它


啊,开源的奇迹

出于好奇,我去查看了您链接的
mintapi
,看看是否有什么明显而简单的方法可以在不进行艰苦设置的情况下重新创建对象实例

事实证明没有,真的(

以下是实例化
Mint
对象时调用的内容:

def __init__(self, email=None, password=None):
    if email and password:
        self.login_and_get_token(email, password)
正如您所看到的,如果您不给它一封真实的
电子邮件
密码
,它什么也不做。(作为旁注,它应该检查
是否为无
,但不管怎样)

因此,我们可以避免轻松地完成安装过程,但现在我们需要找出如何根据以前的数据伪造安装过程

查看
.login\u和\u get\u token()
,我们可以看到以下内容:

def login_and_get_token(self, email, password):
    if self.token and self.driver:
        return

    self.driver = get_web_driver(email, password)
    self.token = self.get_token()
同样,这也很简单。如果它已经有了一个令牌,那么它就完成了,所以它就离开了。如果没有,它就设置一个驱动程序,并通过调用
.get\u token()
来设置
.token

这使得整个过程非常容易重写。只需实例化一个
Mint
对象,不带如下参数:

mint = mintapi.Mint()
然后在其上设置
.token

mint.token = 'something magical'
现在您有了一个几乎处于就绪状态的对象。问题是它基本上依赖于
self.driver
进行每个方法调用,包括
。initiate\u account\u refresh()

这看起来像是一个简单的
POST
,我们可以用
requests.POST()
调用来代替,但我怀疑,当它通过web浏览器进行操作时,它依赖于某种形式的cookie或会话存储

如果您想进行实验,可以将
Mint
子类化如下:

class HeadlessMint(Mint):

    def post(self, url, **kwargs):
        return requests.post(url, **kwargs)
但我的猜测是,随着时间的推移,将会出现更多的问题

好消息是,这个
mintapi
项目看起来相当简单,而将其改写为不依赖于web浏览器对于一个经验不足的人来说并不是一个不合理的项目,所以请把它放在你的后口袋里


至于pickle,我不相信它会起作用,因为我不相信子类化会起作用——我认为浏览器的存在很重要。即使你pickle你的
mint
实例,当你尝试加载它时,它也会丢失它的浏览器


最简单的解决方案很可能是让脚本长时间运行,而不是每小时运行一次,而是运行一次,然后它做它需要做的事情,然后休眠一个小时,然后再执行。这样,你可以在一开始就登录一次,然后它可以在会话运行期间保持该会话。啊,开源的奇迹

出于好奇,我去查看了您链接的
mintapi
,看看是否有什么明显而简单的方法可以在不进行艰苦设置的情况下重新创建对象实例

事实证明没有,真的(

以下是实例化
Mint
对象时调用的内容:

def __init__(self, email=None, password=None):
    if email and password:
        self.login_and_get_token(email, password)
正如您所看到的,如果您不给它一封真实的
电子邮件
密码
,它什么也不做。(作为旁注,它应该检查
是否为无
,但不管怎样)

因此,我们可以避免轻松地完成安装过程,但现在我们需要找出如何根据以前的数据伪造安装过程

查看
.login\u和\u get\u token()
,我们可以看到以下内容:

def login_and_get_token(self, email, password):
    if self.token and self.driver:
        return

    self.driver = get_web_driver(email, password)
    self.token = self.get_token()
同样,这也很简单。如果它已经有了一个令牌,那么它就完成了,所以它就离开了。如果没有,它就设置一个驱动程序,并通过调用
.get\u token()
来设置
.token

这使得整个过程非常容易重写。只需实例化一个
Mint
对象,不带如下参数:

mint = mintapi.Mint()
然后在其上设置
.token

mint.token = 'something magical'
现在您有了一个几乎处于就绪状态的对象。问题是它基本上依赖于
self.driver
进行每个方法调用,包括
.init