Cython模块导入和Pickling的问题
我用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
是的,你有三种选择:
- 把PYTHONPATH设置成包含dmct:
PYTHONPATH=$PYTHONPATH:prng
- 使用sys.path:
from os.path import dirname, join import sys sys.path.append(join(dirname(__file__), 'prng')
- 在你的.py文件中做同样的引入:
from prng import dcmt