2

Linuxで作成されたオブジェクトの選択を解除し、(Windowsで)選択を解除しようとすると、モジュールの依存関係の失敗が発生します。ピクルスはLinuxでは正しくピクルスを外しますが、Windowsでは失敗します。どちらのシステムもPython2.6を実行しています。

私はピクルスのマニュアルページ(特にピクルスのない環境をピクルスの環境と同じにすることに焦点を当てています)と、ここでいくつかの素晴らしいアドバイスを研究しましたが、それでも私は困惑しています。ほとんどの人は、sys.modulesが正しくロードされていることを確認するようにアドバイスしています。これが私が試みていることを示すいくつかのスニペットです:

酸洗いコード:

...
pickle_fp = self.getPickleFile('wb')
pickler = Pickler(pickle_fp, protocol=2)
pickler.dump(archive)
pickle_fp.close()
...

選択解除コードに、sys.modulesディクショナリを出力する行を追加して、存在するモジュールを確認できるようにしました。

...
pickle_fp = self.getPickleFile('rb')
unpickler = Unpickler(pickle_fp)
pprint.pprint(sys.modules)
package = unpickler.load()
pickle_fp.close()
...

Linuxでアンピックルを実行すると、うまく機能します。Linux on Windowsで生成されたピクルスを解凍しようとすると、次のようになります。

...
ImportError: No module named photo_data

環境に関してはpprint.pprint(sys.modules)、Linux上でプロデュース

...
'photo_data': <module 'photo_data' from 
'/home/xxx/Desktop/PythonPhoto/photo_data.pyc'>,
...

およびWindowsの場合

...
'photo_data': <module 'photo_data' from                       
'C:\Users\xxx\git\PhotoManagement\Photo\src\photo_data.pyc'>,
...

したがって、私はphoto_dataその環境にモジュールを持っているように見えます。プロトコルなしでpickleを使用してみました(デフォルトは0)。unix2dosを実行して文字を削除してみました。私は公式に困惑しています。

ご協力いただきありがとうございます!


コメントの提案に基づいて、機能しない最も単純なケースを生成しました。私がピクルスにしているクラスは次のようになります。

class photo_data:
    def __init__(self):
        self.isdir = False
        self.size = 0
        self.mtime = -(sys.maxint - 1) #Set default time to very old
        self.timestamp = datetime.datetime.strptime('1700:1:1 00:00:00', '%Y:%m:%d %H:%M:%S')
        self.gotTags = False
        self.signature = ''
        self.fileMD5 = ''
        self.userTags = ''
        self.inArchive = False
        self.candidates = []
        self.dirpaths = []
        self.filepaths = []      

class photo_collection:  #This class should be data only

    def __init__(self):
        self.host = ''
        self.path = ''
        self.photo = dict()
        self.pickle = None
        self.datasetChanged = False

    def __getitem__(self, key):
        return self.photo[key]

    def __setitem__(self, key, value):
        self.photo[key] = value

私のユースケースでは、photo_collectionオブジェクトがインスタンス化され、ディクショナリself.photoはのインスタンスで埋められますphoto_data。システム間で機能する最も単純なケースは、1枚の写真が含まれるディレクトリであり、任意に複雑なケースがシステムで機能します。システム間で機能しない最も単純なケースは、1つの写真を含むディレクトリと、写真を含む1つのサブディレクトリです。

リクエストに応じて、に保存されている2つのピクルスファイルを添付しましたformat = 0。それらを比較すると、プログラムがファイルツリーを異なる順序で下降していることがわかります(システムとOSの間でディレクトリをコピーしたので、おそらく大きな驚きではありません)が、それ以外の場合は、ファイル以外の同じ構造で開閉するようです-特定のデータ。別の場所にファイルをアップロードする方法がわからないので、ここにインラインで含めます。

これは、Windowsで生成されたピクルスです。

(iphoto_data
photo_collection
p0
(dp1
S'path'
p2
S'C:\\Users\\scott_jackson\\Desktop\\phototest'
p3
sS'host'
p4
S'4DAA1001312'
p5
sS'pickle'
p6
NsS'datasetChanged'
p7
I01
sS'photo'
p8
(dp9
S'C:\\Users\\scott_jackson\\Desktop\\phototest\\img_4697.jpg'
p10
(iphoto_data
photo_data
p11
(dp12
S'isdir'
p13
I00
sS'dirpaths'
p14
(lp15
sS'filepaths'
p16
(lp17
sS'timestamp'
p18
cdatetime
datetime
p19
(S'\x07\xda\x04\x12\x124&\x00\x00\x00'
p20
tp21
Rp22
sS'gotTags'
p23
I01
sS'signature'
p24
S'9b2ca527b2bf0865d9b87ecd2a68d417'
p25
sS'fileMD5'
p26
S''
p27
sS'candidates'
p28
(lp29
sS'mtime'
p30
F1347576558.0
sS'inArchive'
p31
I00
sS'userTags'
p32
S'NA'
p33
sS'size'
p34
L6489323L
sbsg3
(iphoto_data
photo_data
p35
(dp36
g13
I01
sg14
(lp37
S'C:\\Users\\scott_jackson\\Desktop\\phototest\\060101 Nags Head'
p38
asg16
(lp39
g10
asg18
g19
(S'\x06\xa4\x01\x01\x00\x00\x00\x00\x00\x00'
p40
tp41
Rp42
sg23
I00
sg24
g27
sg26
g27
sg28
(lp43
sg30
I-2147483646
sg31
I00
sg32
g27
sg34
I0
sbsS'C:\\Users\\scott_jackson\\Desktop\\phototest\\060101 Nags Head\\img_1150.jpg'
p44
(iphoto_data
photo_data
p45
(dp46
g13
I00
sg14
(lp47
sg16
(lp48
sg18
g19
(S'\x07\xd6\x01\x01\x11\t#\x00\x00\x00'
p49
tp50
Rp51
sg23
I01
sg24
S'5925063685af0d741a23fe6d75523741'
p52
sg26
g27
sg28
(lp53
sg30
F1347751812.0
sg31
I00
sg32
g33
sg34
L538233L
sbsS'C:\\Users\\scott_jackson\\Desktop\\phototest\\060101 Nags Head'
p54
(iphoto_data
photo_data
p55
(dp56
g13
I01
sg14
(lp57
sg16
(lp58
g44
asg18
g19
(S'\x06\xa4\x01\x01\x00\x00\x00\x00\x00\x00'
p59
tp60
Rp61
sg23
I00
sg24
g27
sg26
g27
sg28
(lp62
sg30
I-2147483646
sg31
I00
sg32
g27
sg34
I0
sbssb.

そしてこれはLinuxで生成されたピクルスです:

(iphoto_data
photo_collection
p0
(dp1
S'path'
p2
S'/home/scott/phototest'
p3
sS'host'
p4
S'barney'
p5
sS'pickle'
p6
NsS'datasetChanged'
p7
I01
sS'photo'
p8
(dp9
S'/home/scott/phototest/060101 Nags Head/img_1150.jpg'
p10
(iphoto_data
photo_data
p11
(dp12
S'isdir'
p13
I00
sS'dirpaths'
p14
(lp15
sS'filepaths'
p16
(lp17
sS'timestamp'
p18
cdatetime
datetime
p19
(S'\x07\xd6\x01\x01\x11\t#\x00\x00\x00'
p20
tp21
Rp22
sS'gotTags'
p23
I01
sS'signature'
p24
S'5925063685af0d741a23fe6d75523741'
p25
sS'fileMD5'
p26
S''
p27
sS'candidates'
p28
(lp29
sS'mtime'
p30
F1347751812.0842018
sS'inArchive'
p31
I00
sS'userTags'
p32
S'NA'
p33
sS'size'
p34
I538233
sbsS'/home/scott/phototest/060101 Nags Head'
p35
(iphoto_data
photo_data
p36
(dp37
g13
I01
sg14
(lp38
sg16
(lp39
g10
asg18
g19
(S'\x06\xa4\x01\x01\x00\x00\x00\x00\x00\x00'
p40
tp41
Rp42
sg23
I00
sg24
g27
sg26
g27
sg28
(lp43
sg30
I-9223372036854775806
sg31
I00
sg32
g27
sg34
I0
sbsS'/home/scott/phototest/img_4697.jpg'
p44
(iphoto_data
photo_data
p45
(dp46
g13
I00
sg14
(lp47
sg16
(lp48
sg18
g19
(S'\x07\xda\x04\x12\x124&\x00\x00\x00'
p49
tp50
Rp51
sg23
I01
sg24
S'9b2ca527b2bf0865d9b87ecd2a68d417'
p52
sg26
g27
sg28
(lp53
sg30
F1347576558.5344362
sg31
I00
sg32
g33
sg34
I6489323
sbsg3
(iphoto_data
photo_data
p54
(dp55
g13
I01
sg14
(lp56
S'/home/scott/phototest/060101 Nags Head'
p57
asg16
(lp58
g44
asg18
g19
(S'\x06\xa4\x01\x01\x00\x00\x00\x00\x00\x00'
p59
tp60
Rp61
sg23
I00
sg24
g27
sg26
g27
sg28
(lp62
sg30
I-9223372036854775806
sg31
I00
sg32
g27
sg34
I0
sbssb.

これらをお好きな「比較」エディタに自由に貼り付けてください。問題を検出するのにピクルスについて十分に知りません。

よろしくお願いします!!

4

2 に答える 2

2

Mac OS XマシンでCRLF(Windows)行末のピクルスを保存することで問題を再現しました。

漬物の機械は改行に非常にこだわっています。ピクルスが非バイナリ転送モードを使用して保存またはコピーされた場合(たとえば、Windowsのテキストエディタで再保存、ASCII FTP転送を使用してコピー、Webサイトからテキストファイルとして保存など)、ピクルスCR文字の追加。

ここで、問題はpickle.pyの次の行です。

module = self.readline()[:-1]

指定したファイルUnpicklerが開か'rb'れているがCRLFが含まれている場合、これらの行はmodule = "photo_data\r"有効なモジュール名ではないを読み取ります。インポートすると、エラーは次のように表示されます

ImportError: No module named photo_data

(ひどく卑劣な!)の後に、印刷されていないキャリッジリターンがあります。photo_data

解決策は、ファイルをバイナリ形式で転送し、ピクルスで実行したり、同様のユーティリティを実行したりしないようにすることです。unix2dosまたは、プロトコル0(テキスト)ピクルスを使用する場合は、'rU'代わりに(ユニバーサル改行モード)を使用してピクルスファイルを開くのが安全です。

ピクルスファイルがMac/Linuxにロードされないも参照してください。

于 2012-09-16T00:50:51.413 に答える
1

今日も同様の問題がありました。 @nneonneoが回答で説明しているように、Linuxでピクルスにされたオブジェクトは、CRLF行末が原因でWindowsにロードできませんでした。

.pkl問題は、オブジェクトがテキストファイルであり、行末を正規化する必要があるとgitが考えていたことです。そのため、Linuxマシンでバイナリ.pklファイルを使用してプロジェクトをプッシュし、Windowsマシンでそれらをプルすると、行末はUNIXの行末ではなくCRLFでした。.gitattributes解決策は、リポジトリにファイルを追加することでした

*.pkl binary

gitがファイルをまったく操作しないように強制します。

次に、ここで提案されているように、変更を「更新」できます。代わりに、プロジェクトを削除して、Windowsマシンで再度クローンを作成しました。

于 2018-04-03T13:01:38.317 に答える