我正在尝试编译以下pyx代码:
#declaring external GSL functions to be used
cdef extern from "math.h":
double sqrt(double)
cdef double Sqrt(double n):
return sqrt(n)
cdef extern from "gsl/gsl_rng.h":
ctypedef struct gsl_rng_type:
pass
ctypedef struct gsl_rng:
pass
gsl_rng_type *gsl_rng_mt19937
gsl_rng *gsl_rng_alloc(gsl_rng_type * T)
cdef gsl_rng *r = gsl_rng_alloc(gsl_rng_mt19937)
cdef extern from "gsl/gsl_randist.h":
double gamma "gsl_ran_gamma"(gsl_rng * r,double,double)
double gaussian "gsl_ran_gaussian"(gsl_rng * r,double)
# original Cython code
def gibbs(int N=20000,int thin=500):
cdef double x=0
cdef double y=0
cdef int i, j
samples = []
#print "Iter x y"
for i in range(N):
for j in range(thin):
x = gamma(r,3,1.0/(y*y+4))
y = gaussian(r,1.0/Sqrt(x+1))
samples.append([x,y])
return samples
smp = gibbs()
这是我的setup.py文件的样子:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy
import sys
if sys.platform == "win32":
include_gsl_dir = sys.exec_prefix+"\gsl\include"
lib_gsl_dir = sys.exec_prefix+"\gsl\lib"
else:
include_gsl_dir = sys.exec_prefix+"\include"
lib_gsl_dir = sys.exec_prefix+"\lib"
ext = Extension("samplers", ["samplers.pyx"],
include_dirs=[numpy.get_include(),
include_gsl_dir],
library_dirs=[lib_gsl_dir],
libraries=["gsl","gslcblas","m"]
)
setup(ext_modules=[ext],
cmdclass = {'build_ext': build_ext})
GSL文件包含在C:\ Users \ MyName \ Anaconda \ gsl \ include \ gsl,C:\ Users \ MyName \ Anaconda \ gsl \ lib \和C:\ Users \ MyName \ Anaconda \ gsl \ bin中。因此,为什么setup.py文件包含对sys.exec_prefix的引用,以获取python可执行文件所在的主Anaconda文件夹。
我如何将GSL与Cython链接有什么问题?当我跑步时:
python setup.py build_ext --inplace
创建PYD文件时,当我尝试从创建pyd的同一文件夹中的python环境导入采样器时,出现了可怕的“ImportError:DLL加载失败:找不到指定的模块”。
我相信它编译错误是因为它无法与GSL文件通信,或者pyx代码出了点问题。我排除了后者,因为它可以成功编译pyd文件而不会出错。
我也尝试过与CythonGSL模块链接,但是如果您查看 init .py,则Win32 gsl必须位于c:\ Program Files \ GnuWin32 \ include中,而我更希望在Anaconda文件夹中包含gsl库。尽管如此,将它们放在c:\ Program Files \ GnuWin32 \ include仍然会给我同样的ImportError错误:DLL ...
最佳答案
当前版本的CythonGSL
使用环境变量LIB_GSL
来识别GSL的位置。仅当c:\Program Files\GnuWin32\include
不存在时,才使用硬编码的LIB_GSL
。因此,只要您设置了LIB_GSL
,就可以将GSL安装放在其他位置。我认为您在设置/
时应使用\
而不是LIB_GSL
。
因此,您需要为CythonGSL创建/修改两个环境变量:LIB_GSL
和PATH
。我认为您可以在批处理文件中使用setlocal
。例如,我认为您可以执行以下操作(我在C:\lib64\gsl
上安装了gsl)来临时设置它:
setlocal
SET LIB_GSL=C:/lib64/gsl
SET PATH=%PATH%;C:\lib64\gsl\bin;
Python
希望这会有所帮助。
关于python - Windows 64和GSL中的Cython,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27078594/