【问题标题】:CythonGSL/ Using GSL on Windows via CythonCythonGSL/ 通过 Cython 在 Windows 上使用 GSL
【发布时间】:2013-04-09 18:54:59
【问题描述】:

机器配置: 我的配置是 windows 7 x64,安装了 python 2.7 和 cython 0.18 (all 64 bit)。我还安装了 MS C++ 2008 Visual Studio。

我有 GSL 二进制文件,并且 Path 指向 GSL\Bin。

我正在使用 MS VS 2008 + SDK 7.0 编译 cython .pyx 文件。我使用 SDK 7.0 命令提示符编译为 c 和 cython。

问题 但是在编译时我收到 LINK 错误 2019,这表明 GSL 文件夹中的头文件未找到。

我的尝试 为了解决这个问题,我下载了 CythonGSL。使用“来自 cythonGSL cimport *”没有用。我去了这个包的初始化文件并更改了它似乎正在搜索的目录以适合我安装 GSL 的位置。 我已经按照 CythonGSL 自述文件所示更新了 setup.py。

这个也没有用!! 在编译时,它说 gsl.lib not found.

知道如何解决这个问题吗?

一个选项是,例如,如果我可以指向一个静态地址来代替

    cdef extern from "libcalg/queue.h":
       with
    cdef extern from "FUll File Path/queue.h":

暂时不行。

setup.py

from distutils.core import setup
from Cython.Distutils import Extension
from Cython.Distutils import build_ext
import cython_gsl
import numpy as np
setup(

    include_dirs = [cython_gsl.get_include(), np.get_include()],
    cmdclass = {'build_ext': build_ext},
    ext_modules = [Extension("lda_gibbs_cython",
                             ["lda_gibbs_cython.pyx"],
                             libraries=cython_gsl.get_libraries(),
                             library_dirs=[cython_gsl.get_library_dir()],
                             include_dirs=[cython_gsl.get_cython_include_dir()])]
    )

唯一的区别是我包含 np.get _include()

我的 .pyx 文件:(借用 https://github.com/twiecki/CythonGSL/blob/master/examples/gibbs.pyx 进行测试)

import numpy as np
cimport numpy as np
cimport cython
DTYPE = np.int
ctypedef np.int_t DTYPE_t
from scipy.special import gammaln
from cython_gsl cimport *

cdef gsl_rng *r = gsl_rng_alloc(gsl_rng_mt19937)

来自 Cython GSL 尝试的错误消息:

D:\LDA\pythonLDA>setup.py build_ext --inplace
running build_ext
cythoning lda_gibbs_cython.pyx to lda_gibbs_cython.c
building 'lda_gibbs_cython' extension
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\Bin\amd64\cl.exe /c /nolog
o /Ox /MD /W3 /GS- /DNDEBUG -IC:\Python27\lib\site-packages -IC:/GSL/include -IC
:\Python27\lib\site-packages\numpy\core\include -IC:\Python27\include -IC:\Pytho
n27\PC /Tclda_gibbs_cython.c /Fobuild\temp.win-amd64-2.7\Release\lda_gibbs_cytho
n.obj
lda_gibbs_cython.c
c:\python27\lib\site-packages\numpy\core\include\numpy\npy_deprecated_api.h(8) :
 Warning Msg: Using deprecated NumPy API, disable it by #defining NPY_NO_DEPRECA
TED_API NPY_1_7_API_VERSION
lda_gibbs_cython.c(2812) : warning C4244: 'function' : conversion from '__int64'
 to 'long', possible loss of data
lda_gibbs_cython.c(4811) : warning C4101: 'getbuffer_cobj' : unreferenced local
variable
lda_gibbs_cython.c(4842) : warning C4101: 'releasebuffer_cobj' : unreferenced lo
cal variable
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\Bin\amd64\link.exe /DLL /n
ologo /INCREMENTAL:NO /LIBPATH:C:/GSL/lib /LIBPATH:C:\Python27\libs /LIBPATH:C:\
Python27\PCbuild\amd64 gsl.lib gslcblas.lib /EXPORT:initlda_gibbs_cython build\t
emp.win-amd64-2.7\Release\lda_gibbs_cython.obj /OUT:D:\LDA\pythonLDA\lda_
gibbs_cython.pyd /IMPLIB:build\temp.win-amd64-2.7\Release\lda_gibbs_cython.lib /
MANIFESTFILE:build\temp.win-amd64-2.7\Release\lda_gibbs_cython.pyd.manifest /MAN
IFEST
LINK : fatal error LNK1181: cannot open input file 'gsl.lib'
error: command 'link.exe' failed with exit status 1181

GCC 尝试

我安装了 TDM-GCC,所以我可以使用标准的 cmd 窗口:

.pyx 和 setup.py 保持不变。我在 -mno-cygwin : gcc building Mercurial (Windows 2000) 处记录并解决了一个问题。还是没有雪茄。我不知道这是否应该是一个单独的问题——如果专家这么认为,我会采取行动。

D:\LDA\pythonLDA>setup.py build_ext --inplace -c mingw32
running build_ext
skipping 'lda_gibbs_cython.c' Cython extension (up-to-date)
building 'lda_gibbs_cython' extension
C:\MinGW64\bin\gcc.exe -mdll -O -Wall -IC:\Python27\lib\site-packages -IC:/GSL/i
nclude -IC:\Python27\lib\site-packages\numpy\core\include -IC:\Python27\include
-IC:\Python27\PC -c lda_gibbs_cython.c -o build\temp.win-amd64-2.7\Release\lda_g
ibbs_cython.o
writing build\temp.win-amd64-2.7\Release\lda_gibbs_cython.def
C:\MinGW64\bin\gcc.exe -shared -s build\temp.win-amd64-2.7\Release\lda_gibbs_cyt
hon.o build\temp.win-amd64-2.7\Release\lda_gibbs_cython.def -LC:/GSL/lib -LC:\Py
thon27\libs -LC:\Python27\PCbuild\amd64 -lgsl -lgslcblas -lpython27 -l -o D:\LDA\pythonLDA\lda_gibbs_cython.pyd
gcc: error: D:\LDA\pythonLDA\lda_gibbs_cython.pyd: No such file or direct
ory
error: command 'gcc' failed with exit status 1

【问题讨论】:

    标签: python windows cython gsl


    【解决方案1】:

    我只使用了CythonGSL——当前版本(https://github.com/twiecki/CythonGSL/blob/master/cython_gsl/__init__.py)读取环境变量LIB_GSL来确定GSL目录的位置。确保您有 LIB_GSL 环境变量指向您的主要 GSL 文件夹(不是 \bin 文件夹)。例如,LIB_GSL=C:/GSL。然后您必须将C:\GSL\bin 添加到您的PATH。我有一个blog post 有详细的解释。

    来自 Chat Discussion 的更多解释: TDM-GCC + EPD + GSL(稍作改动 - GSL 文件必须位于 C:\Program Files\GnuWin32\。这非常适用于 64 位 Windows 7.

    使用可能在 MS VS C++ 2008 上编译的 Windows 二进制文件可能会导致与 mingw64 编译的 C++ 程序发生冲突。


    更多设置说明(已添加)

    一般来说,使用科学的 Python 发行版,例如 Python(x,y)(免费)、Enthought Canopy(EPD 的继任者,有限免费版)或 Anaconda(除了高级软件包之外免费)要容易得多在 vanilla python 之上安装单独的包。似乎所有三个发行版都带有 MinGW,所以如果你不需要对 Cython 的 openmp 支持,你应该很好,如果你需要,你可以安装TDM-GCC

    GSL而言,您可以从oscats项目下载二进制GSL。它有 32 位和 64 位二进制文​​件,带有开发头。

    我的设置是Anaconda + TDM-GCC + GSL(来自oscats 项目),它运行良好。

    【讨论】:

    • Joon,感谢您的回复。我想知道这是否与 SDK 命令提示符没有进入环境变量有关。您是否在 Windows 上设置了类似的 C++?愿善业降临于你:-)。顺便说一句,您附加的链接似乎不起作用,但是这个可以。 raw.github.com/twiecki/CythonGSL/master/cython_gsl/__init__.py
    • 谢谢我修复了链接。不,我正在使用 TDM-GCC。您的 setup.py 看起来不正确 - 请尝试在 github.com/twiecki/CythonGSL README 中使用示例 setup.py
    • 尝试使用安装文件 - 不太奏效。请参阅上述问题的变化。感谢 TDM-GCC 提示。我在某处读到 MS VS 2008 用于编译 python 2.7 x64,因此只有使用相同运行时的 c 文件才能工作。但似乎 TDM GCC 会起作用。我想知道我是否将 TDM GCC 64 位与普通命令提示符一起使用(因为我可以使用普通命令提示符进行编译,应该能够轻松找到环境​​变量)。另一方面,我不是这方面的专家!
    • 所以我尝试了 TDM-GCC - 现在标准命令提示符(不是 sdk 的)需要 vcvarsall.bat...scylla 和 charibdis。
    • 您的新错误消息显示gcc: error: D:\LDA\pythonLDA\lda_gibbs_cython.pyd: No such file or direct ory,因此它看起来缺少.pyd 文件,它是一个定义文件。您是否尝试在不同的 cython 模块之间共享 cdef 类? (因为通常你不需要.pyd 文件)看看docs.cython.org/src/userguide/sharing_declarations.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多