[英]Cython in Windows 64 with 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的引用以獲取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的位置。 僅當LIB_GSL
不存在時, LIB_GSL
使用硬編碼的c:\\Program Files\\GnuWin32\\include
。 因此,只要您設置了LIB_GSL
就可以將GSL安裝放在其他位置。 我認為設置LIB_GSL
時應使用/
而不是\\
。
因此,您需要為CythonGSL創建/修改兩個環境變量: LIB_GSL
和PATH
。 我認為您可以在批處理文件中使用setlocal
。 例如,我認為您可以執行以下操作(我在C:\\lib64\\gsl
安裝了C:\\lib64\\gsl
)來臨時設置它:
setlocal
SET LIB_GSL=C:/lib64/gsl
SET PATH=%PATH%;C:\lib64\gsl\bin;
Python
希望這會有所幫助。
我相信我已經解決了這個問題。
我的PATH變量無權訪問GSL文件夾。 在運行時,它需要訪問gsl / bin文件夾,因此我需要將C:\\ Users \\ MyName \\ Anaconda \\ gsl \\ bin添加到系統路徑變量中。 我已經嘗試過setx PATH“%PATH%; C:\\ Users \\ MyName \\ Anaconda \\ gsl \\ bin”,但這確實可行。 但是,當我關閉CMD窗口並重做時,它不再起作用。
當我使用它進行分發時,是否有通過批處理文件永久設置此設置的方法? 我有用於conda構建的bld.bat文件,但即使在那里,setx命令也不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.