Cython模块导入和Pickling的问题

1 投票
1 回答
1391 浏览
提问于 2025-04-16 20:06

我用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

要让它工作,我需要把prng添加到Python的路径中。

为什么它不再工作了?我该怎么让它重新工作呢?

1 个回答

2

是的,你有三种选择:

  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

撰写回答