回答編集履歴

5

追記

2021/08/27 12:09

投稿

quickquip
quickquip

スコア11202

test CHANGED
@@ -14,11 +14,13 @@
14
14
 
15
15
 
16
16
 
17
- > `'__main__'` はトップレベルのコードが実行されるスコープの名前です。
17
+ > `'__main__'` はトップレベルのコードが実行されるスコープの名前です。モジュールが、標準入力から読み込まれたとき、スクリプトとして実行されたとき、あるいはインタラクティブプロンプトのとき、`__name__` には `'__main__'` が設定されます。
18
18
 
19
19
 
20
20
 
21
21
  なので、実行したファイル(`python hogehoge.py`で実行した時のhogehoge.py)で定義されたクラスをpickle化した時、pickle化されたデータに入っているクラス名は(`hogehoge.encoding`ではなく)`__main__.encoding`になります。
22
+
23
+ (Jupyterのnotebookやconsoleもインタラクティブプロンプトと同様で、スコープ名は`__main__`です)
22
24
 
23
25
 
24
26
 

4

追記

2021/08/27 12:09

投稿

quickquip
quickquip

スコア11202

test CHANGED
@@ -29,3 +29,9 @@
29
29
 
30
30
 
31
31
  エラーから逆算するとそういうことと推測します。
32
+
33
+
34
+
35
+ 分散処理のワーカープロセスを実行していて、そちらで非pickle化されていると想像しました。
36
+
37
+ encodingの定義をモジュールに分離する必要があるかと思います。

3

追記

2021/08/27 11:40

投稿

quickquip
quickquip

スコア11202

test CHANGED
@@ -22,7 +22,9 @@
22
22
 
23
23
 
24
24
 
25
- 非pickle化する方が別の実行ファイルで、その中で`from hogehoge import encoding`してクラス解決している、encodingクラスの完全修飾名は`hogehoge.encoding`です。かつ、`__main__`は実行に指定したファイルになっているので`__main__.encoding`が解決できせん
25
+ 非pickle化する時に別の実行ファイルで起動していて、その中で`from hogehoge import encoding`してクラスを参照している、encodingクラスの完全修飾名は`hogehoge.encoding`です。かつ、`__main__`は実行に指定したファイルになっていま
26
+
27
+ そのため、pickle化されたデータに入っているクラス名の`__main__.encoding`が解決できません。
26
28
 
27
29
 
28
30
 

2

些細

2021/08/27 11:35

投稿

quickquip
quickquip

スコア11202

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- > '__main__' はトップレベルのコードが実行されるスコープの名前です。
17
+ > `'__main__'` はトップレベルのコードが実行されるスコープの名前です。
18
18
 
19
19
 
20
20
 

1

途中で投稿された

2021/08/27 11:33

投稿

quickquip
quickquip

スコア11202

test CHANGED
@@ -3,3 +3,27 @@
3
3
 
4
4
 
5
5
  > 関数 (組込みおよびユーザー定義) は、値ではなく、"完全修飾" された名前参照で pickle 化されます。
6
+
7
+ > (略)
8
+
9
+ > クラスも同様に名前参照で pickle 化されるので、unpickle 化環境には同じ制限が課せられます。
10
+
11
+
12
+
13
+ [https://docs.python.org/ja/3/library/__main__.html#module-__main__](https://docs.python.org/ja/3/library/__main__.html#module-__main__)
14
+
15
+
16
+
17
+ > '__main__' はトップレベルのコードが実行されるスコープの名前です。
18
+
19
+
20
+
21
+ なので、実行したファイル(`python hogehoge.py`で実行した時のhogehoge.py)で定義されたクラスをpickle化した時、pickle化されたデータに入っているクラス名は(`hogehoge.encoding`ではなく)`__main__.encoding`になります。
22
+
23
+
24
+
25
+ 非pickle化する方が別の実行ファイルで、その中で`from hogehoge import encoding`してクラス名を解決している時、encodingクラスの完全修飾名は`hogehoge.encoding`です。かつ、`__main__`は実行に指定したファイルになっているので`__main__.encoding`が解決できません。
26
+
27
+
28
+
29
+ エラーから逆算するとそういうことと推測します。