質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

639閲覧

自作ライブラリ内のクラスをpickle化した後,これを自作ライブラリの無い環境で非pickle化したい

kt19906

総合スコア47

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2023/02/20 05:46

実現したいこと

自作ライブラリ内のクラスをpickle化した後,これを自作ライブラリの無い環境で非pickle化したい.

前提

”MyLib”という自作のライブラリ内で次のクラスを定義します.

python(test.py)

1class TestClass(): 2 def __init__(self): 3 self.a = 0 4 5 def write(self,file): 6 with open(file,"wb") as f: 7 pickle.dump(self,f) 8

この自作ライブラリを使ってpickle化します.

python

1from mylib.test import TestClass 2 3test = TestClass() 4test.write("test.pickle") # --> "test.pickle"が作成される

発生している問題・エラーメッセージ

これをmylibの無い環境で非pickle化するとエラーになります.

python

1with open("test.pickle","rb") as f: 2 test = pickle.load(f) 3 4# ModuleNotFoundError: No module named 'mylib'

mylibが無いため非pickle化に失敗することは分かるのですが,これを可能にする方法はありますか?
よろしくお願いいたします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2023/02/20 06:05

その状況で非pickle化して、結果として何を得たいのでしょうか。
kt19906

2023/02/20 06:12

mylibを使ってデータの解析を行なって,解析の結果(この質問でいうTestClass)をpickeファイルとして,別のパソコンで見たいと思っています. 基本的に得られる結果は数値などのみなので,わざわざクラスをpickle化する必要はないのですが,クラスの方が便利なのと,単純にそのような方法があるのか知りたいと思っています.
guest

回答2

0

一応、dill · PyPI を使うとできる様です。

TestClass のモジュールを __main__ に付け替えてダンプします。

dump_instance.py

python

1import dill 2import inspect 3import ast 4from mylib.test import TestClass 5 6def mainify(obj): 7 import __main__ 8 import inspect 9 import ast 10 11 s = inspect.getsource(obj) 12 m = ast.parse(s) 13 co = compile(m, '<string>', 'exec') 14 exec(co, __main__.__dict__) 15 16mainify(TestClass) 17test = TestClass() 18with open("test.pickle", "wb") as f: 19 dill.dump(test, f)

作成された test.pickle を mylibの無い環境にコピー(もしくは移動)してロードします。

load_instance.py

python

1import dill 2 3with open("test.pickle","rb") as f: 4 test = dill.load(f) 5 6print(test.__class__) 7print(test.a) 8 9# <class '__main__.TestClass'> 10# 0

投稿2023/02/20 07:44

melian

総合スコア19714

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

mylibが無いため非pickle化に失敗することは分かるのですが,これを可能にする方法はありますか?

できません。mylib が必要です。

基本的に得られる結果は数値などのみなので,わざわざクラスをpickle化する必要はない

そういう場合は、CSV、JSON、XML など開発言語に依存しない形式でやりとりするのが定石です。

投稿2023/02/20 06:18

int32_t

総合スコア20845

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kt19906

2023/02/20 06:29

やはりできないのですね. ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問