簡體   English   中英

Windows 64和GSL中的Cython

[英]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_GSLPATH 我認為您可以在批處理文件中使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM