Cython问题,模块导入和Pickling

时间:2011-06-22 19:11:37

标签: python pickle cython

我使用Cython的自定义随机数生成器构建。我不明白为什么,但它不再有用......我猜它与Python 2.7有关,或者可能是Cython的新版本。

在dcmtrand.pyx中,我有:

...
import dcmt
...
cdef class RandomState:
    ...
    def __reduce__(self):
        return (dcmt.__RandomState_ctor, (), self.get_state())
    ...

dcmt是一个文件夹。在其中,我有 init .py文件:

from dcmtrand import *

def __RandomState_ctor():
    return RandomState.__new__(RandomState)

我使用

编译它
python setup.py build_ext --inplace

然后我将生成的dcmtrand.so文件复制到dcmt文件夹中,然后将dcmt文件夹移动到我的项目中。

现在,如果我导入dcmt,一切正常:

import dcmt
import cPickle
dc = dcmt.DynamicCreator(5)
a = dc[0]
cPickle.dumps(a)

但是,如果我想将dcmt放入子包中,它就不再有效了:

from prng import dcmt

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "prng/dcmt/__init__.py", line 1, in <module>
    from dcmtrand import *
  File "dcmtrand.pyx", line 10, in init dcmtrand (dcmtrand.c:6955)
ImportError: No module named dcmt

为了使它工作,我需要在Python路径中添加prng。

为什么它不再有效?如何让它再次运作?

1 个答案:

答案 0 :(得分:2)

是的,你有3个选择:

  1. 将PYTHONPATH设置为包含dmct:PYTHONPATH=$PYTHONPATH:prng
  2. 使用sys.path:
    from os.path import dirname, join
    import sys
    sys.path.append(join(dirname(__file__), 'prng')
    
  3. 执行与.py中相同的内容:from prng import dcmt