【问题标题】:Import a file like a model in python?在python中导入像模型一样的文件?
【发布时间】:2016-12-27 08:40:40
【问题描述】:

一个对象已被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/

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

【问题讨论】:

  • 那为什么不简单地传递open完整路径呢?
  • 是的,那是因为,如前所述,模块可以放置在任何地方......所以完整路径不确定。
  • 我看不出调用代码可以“猜测”pickle 文件的放置位置。我的建议是将其存储在所有调用代码都知道的预定义位置(甚至可以配置)。
  • 但我想如果它可以放在相对路径中会更好(并且在模型的目录下)。腌制文件就像一个字符串或诸如此类的东西。我应该打扰配置吗?如果这是解决问题的唯一方法,好吧,重点。

标签: python-2.7 path pickle python-import


【解决方案1】:

做一点路径操作应该可以工作:

在模块constant.py:

import os

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

【讨论】:

  • 是的,它工作正常。我想知道是否可以使用 python 资源管理器来解决此类问题。
【解决方案2】:

看起来您希望 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)

或者从腌制的文件中取出并粘贴进去。

示例

腌制你的对象:

>>> 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 访问

【讨论】:

    猜你喜欢
    • 2018-05-19
    • 2018-08-13
    • 2015-05-01
    • 2021-03-28
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    相关资源
    最近更新 更多