在 python 中导入模型之类的文件?

Import a file like a model in python?

一个对象已经被pickle序列化,将被放置在任何地方(任何目录下)的模型使用。由于该对象经常使用并且是模型的一部分,我想让模型包含 pickle 文件(将文件放在模型的目录下)作为变量。

./data/constant.py
object = pickle.load(open('object.pkl')) ./data/object.pkl

./code/model01.py

from ..data import constant 
# or
# from __future import absolute_import 
# from model.data import constant
object = constant.object

./code/model02.py
from ..data import constant object = constant.object

问题显然是 python 将在 ./code/ 下搜索 object.pkl(以及我在模型外部使用模型功能的任何地方)而不是 ./data/ .

我做的对吗?有更好的解决方案吗?谢谢。 我认为这个问题可能会重复(这是一个非常常见的问题),但我在这里找不到任何相关的档案。如果是这样,请帮助我重定向到那里。

您似乎希望 object 成为模块 constant 的一部分。

一种方法是将腌制对象放入 constant.py:

my_object = pickle.loads(pickled_object)  # don't use the name `object` it is a built-in

注意 loads 中的 s

pickled_object 需要放在 constant.py 内,在上面显示的行之前。它必须是一个字节串。 您可以直接从对象创建它:

pickled_object = pickle.dumps(obj)

或者从 pickled 文件中取出并粘贴进去。

例子

腌制你的对象:

>>> import pickle
>>> obj = [1, 2, 3]
>>> pickle.dumps(obj)
b'\x80\x03]q\x00(K\x01K\x02K\x03e.'

现在,在 constant.py:

pickled_object = b'\x80\x03]q\x00(K\x01K\x02K\x03e.'
my_object = pickle.loads(pickled_object)

因此,my_object[1, 2, 3],可以通过 constant.my_object

访问

进行一些路径操作应该可行:

在模块 constant.py 中:

import os

path = os.path.dirname(os.path.abspath(__file__))
obj = pickle.load(open(os.path.join(path, 'object.pkl')))