Python — Cython в Windows 64 с GSL

Я пытаюсь скомпилировать следующий код 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 для получения основной папки Anaconda, в которой находится исполняемый файл python.

Что-то не так с тем, как я связываю GSL с Cython? Когда я бегу:

 python setup.py build_ext --inplace

PYD-файл создан, но я получаю ужасное «ImportError: Ошибка загрузки DLL: указанный модуль не найден», когда я пытаюсь импортировать сэмплеры из среды python в той же папке, где создается pyd.

Я считаю, что он скомпилирован неправильно, потому что он не может связаться с файлами GSL, или что-то не так с кодом PyX. Я исключил последний, так как он успешно компилирует файл pyd без ошибок.

Я также пытался связать с модулем CythonGSL, но если вы посмотрите на в этом.py, для win32 gsl должен быть расположен в c: \ Program Files \ GnuWin32 \ include, и я предпочитаю иметь библиотеку gsl в папке Anaconda. Тем не менее, размещение их в c: \ Program Files \ GnuWin32 \ include по-прежнему дает мне ту же ошибку ImportError: DLL …

1

Решение

Текущая версия CythonGSL использует переменную среды LIB_GSL распознать местоположение GSL. Он использует жестко c:\Program Files\GnuWin32\include только когда LIB_GSL не существует. Таким образом, вы можете поместить свою установку GSL в другое место, если у вас есть LIB_GSL задавать. Я думаю, что вы должны использовать / вместо \ когда вы установите LIB_GSL,

Таким образом, вам нужно создать / изменить две переменные окружения, чтобы CythonGSL работал: LIB_GSL а также PATH, Я думаю, что вы можете использовать setlocal в вашем командном файле. Например, я думаю, что вы можете сделать следующее (у меня установлен gsl в C:\lib64\gsl) установить его временно:

setlocal
SET LIB_GSL=C:/lib64/gsl
SET PATH=%PATH%;C:\lib64\gsl\bin;
Python

Надеюсь, это полезно.

1

Другие решения

Я думаю, что я понял проблему.

Моя переменная PATH не имела доступа к папкам GSL. Во время выполнения ему нужен доступ к папке gsl / bin, поэтому мне нужно добавить C: \ Users \ MyName \ Anaconda \ gsl \ bin в переменную системного пути. Я пробовал setx PATH «% PATH%; C: \ Users \ MyName \ Anaconda \ gsl \ bin», и это работает. Но когда я закрываю окно CMD и повторяю его, оно больше не работает.

Поскольку я использую это для распространения, есть ли способ установить это постоянно через командный файл? У меня есть файл bld.bat для сборки conda, но даже там команда setx не работает.

0