[解決済み] Pythonの関数をpickleする(あるいはそのコードをシリアライズする)簡単な方法はありますか?
2022-07-25 20:01:35
質問
私はネットワーク接続を介して関数を転送しようとしています(asyncoreを使用して)。このような転送のためにpython関数(少なくともこの場合、副作用がないもの)をシリアライズする簡単な方法はありますか?
私は理想的には、これらのような関数のペアを持ちたいと思います。
def transmit(func):
obj = pickle.dumps(func)
[send obj across the network]
def receive():
[receive obj from the network]
func = pickle.loads(s)
func()
どのように解決するのですか?
関数のバイトコードをシリアライズし、呼び出し側で再構築することができます。 その際 マーシャル モジュールを使ってコードオブジェクトをシリアライズし、それを関数に再構築することができます。
import marshal
def foo(x): return x*x
code_string = marshal.dumps(foo.__code__)
次にリモートプロセスで(code_stringを転送した後)。
import marshal, types
code = marshal.loads(code_string)
func = types.FunctionType(code, globals(), "some_func_name")
func(10) # gives 100
いくつか注意点があります。
-
marshalのフォーマット(それに関してはどんなPythonバイトコードでも)は、主要なPythonのバージョン間で互換性がない可能性があります。
-
cpythonの実装のためにのみ動作します。
-
もし関数がグローバル(インポートされたモジュール、他の関数などを含む)を参照し、それを拾う必要がある場合は、それらもシリアライズするか、リモート側で再作成する必要があります。 私の例では、リモート プロセスのグローバル名前空間を与えるだけです。
-
クロージャやジェネレータ関数のような、より複雑なケースをサポートするために、おそらくもう少し工夫が必要でしょう。
関連
-
[解決済み] AndroidでPythonを実行する方法はありますか?
-
[解決済み] Pythonで複数行のコメントを作成する方法はありますか?
-
[解決済み] なぜPythonのコードは関数の中でより速く実行されるのですか?
-
[解決済み] Pythonで現在のユーザー名を取得するポータブルな方法はありますか?
-
[解決済み】Pythonマルチプロセッシング PicklingError: <type 'function'> をピクルスにできない。
-
[解決済み] Pythonのコードを一行ずつプロファイリングするには?
-
[解決済み] Django のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonのマルチプロセッシングプールimap_unorderedの呼び出しの進捗を表示しますか?
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] SQLAlchemy - テーブルのリストを取得する
-
[解決済み] 範囲指定された浮動小数点数のランダムな配列を生成します。
-
[解決済み] PyMongoで.sortを使用する
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
-
[解決済み] Linuxで2つのバージョンのPythonを使用する方法。
-
[解決済み] Pandas Merge - カラムの重複を回避する方法