<p>实际上,如果已经从<code>python2.x</code>中选取对象,那么通常可以通过<code>python3.x</code>读取。此外,如果从<code>python3.x</code>中选取了对象,则通常可以通过<code>python2.x</code>读取它们,但前提是它们被转储时<code>protocol</code>设置为<code>2</code>或更低。</p>
<pre><code>Python 2.7.10 (default, Sep 2 2015, 17:36:25)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> x = [1,2,3,4,5]
>>> import math
>>> y = math.sin
>>>
>>> import pickle
>>> f = open('foo.pik', 'w')
>>> pickle.dump(x, f)
>>> pickle.dump(y, f)
>>> f.close()
>>>
dude@hilbert>$ python3.5
Python 3.5.0 (default, Sep 15 2015, 23:57:10)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> with open('foo.pik', 'rb') as f:
... x = pickle.load(f)
... y = pickle.load(f)
...
>>> x
[1, 2, 3, 4, 5]
>>> y
<built-in function sin>
</code></pre>
<p>另外,如果您正在寻找<code>cPickle</code>,现在是<code>_pickle</code>,而不是<code>pickle</code>。</p>
<pre><code>>>> import _pickle
>>> _pickle
<module '_pickle' from '/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload/_pickle.cpython-35m-darwin.so'>
>>>
</code></pre>
<P>您还问了如何使用内置的(C++)版本来阻止^ {CD9>}。如果您想使用类对象,可以使用<code>_dump</code>和<code>_load</code>,或者使用<code>_Pickler</code>类。困惑的?旧的<code>cPickle</code>现在是<code>_pickle</code>,但是<code>dump</code>,<code>load</code>,<code>dumps</code>,和<code>loads</code>都指向<code>_pickle</code>…而<code>_dump</code>,<code>_load</code>,<code>_dumps</code>,和<code>_loads</code>指向纯python版本。例如:</p>
<pre><code>>>> import pickle
>>> # _dumps is a python function
>>> pickle._dumps
<function _dumps at 0x109c836a8>
>>> # dumps is a built-in (C++)
>>> pickle.dumps
<built-in function dumps>
>>> # the Pickler points to _pickle (C++)
>>> pickle.Pickler
<class '_pickle.Pickler'>
>>> # the _Pickler points to pickle (pure python)
>>> pickle._Pickler
<class 'pickle._Pickler'>
>>>
</code></pre>
<p>因此,如果不想使用内置版本,那么可以使用<code>pickle._loads</code>等。</p>