由于Ubuntu下的NumPy Fortran混合,Theano失败
我在我的机器上安装了nosetests,但是nosetests出现了与Numpy/Fortran相关的错误消息。对我来说,看起来Numpy是用不同于Theano的Fortran版本编译的。我已经重新安装了Theano(由于Ubuntu下的NumPy Fortran混合,Theano失败,numpy,scipy,gfortran,theano,Numpy,Scipy,Gfortran,Theano,我在我的机器上安装了nosetests,但是nosetests出现了与Numpy/Fortran相关的错误消息。对我来说,看起来Numpy是用不同于Theano的Fortran版本编译的。我已经重新安装了Theano(sudo-pip-uninstall Theano+sudo-pip-install--upgrade--no-deps-Theano)和Numpy/Scipy(apt-get-install--replaunt-python-numpython-Scipy),但这没有帮助 你建议
sudo-pip-uninstall Theano
+sudo-pip-install--upgrade--no-deps-Theano
)和Numpy/Scipy(apt-get-install--replaunt-python-numpython-Scipy
),但这没有帮助
你建议采取什么步骤
完整错误消息:
我的研究:
关于未定义符号的页面:\u gfortran\u st\u write\u done'
错误:
如果您看到错误消息
importorror:/usr/lib/atlas/libblas.so.3gf:未定义符号:_gfortran\u st_write\u done
在构建SciPy时,这意味着NumPy在构建过程中选择了错误的Fortran编译器(例如ifort)
使用以下命令重新编译NumPy:
python setup.py build--fcompiler=gnu95
或任何合适的(请参见python setup.py build--help fcompiler
)
但是:
使用的软件版本:
- scipy 0.10.1(scipy.test()工作)
- NumPy 1.6.2(NumPy.test()工作)
- theano 0.5.0(一些测试失败,带有
)未定义符号:\u gfortran\u st\u write\u done'
- python 2.6.6
- Ubuntu 10.10
apt get remove
和find-name XXX-delete将numpy和scipy从系统中删除
然后,我使用sudopythonsetpy.py安装
从github源代码安装了numpy和scipy
之后,我再次输入了sudopip卸载theano
和sudopip安装-升级-无deps theano
错误仍然存在:/
我还尝试了apt-get-source
…+apt-get-build-dep…
方法,但对于我的旧Ubuntu(10.10),它安装了太旧版本的numpy和scipy,不需要:值错误:numpy>=1.4是必需的(从/usr/local/lib/python2.6/dist-packages/numpy/\u init\u.pyc中检测到1.3.0)
您尝试过从源代码重新编译numpy吗
我不熟悉Ubuntu软件包系统,所以我无法检查您的dist软件包/numpy
中有什么。有了一个干净的NumPy
源文件存档,您应该有一个setup.py
,与目录NumPy
、tools
和benchmarks
处于同一级别。我很确定这就是您想要用于python setup.py构建的
[编辑]
现在,您已经使用适当的--fcompiler
选项重新编译了numpy
,也许您可以尝试使用Theano
,也就是说,直接从源代码编译,而不依赖apt get
甚至pip
。通过这种方式,您应该能够更好地控制构建过程,这将使调试/尝试找到解决方案变得更容易 我也有同样的问题。我找到的解决方案是在theano/gof/cmodule.py中添加一个hack,每当libs中有“blas”时,就链接到gfortran。这就解决了问题
class GCC_compiler(object):
...
@staticmethod
def compile_str(module_name, src_code, location=None,
include_dirs=None, lib_dirs=None, libs=None,
preargs=None):
...
cmd.extend(['-l%s' % l for l in libs])
if 'blas' in libs:
cmd.append('-lgfortran')
我也遇到了同样的问题,在查看了源代码之后,user212658的回答似乎可以正常工作(我没有尝试过)。然后,我寻找一种在不修改源代码的情况下部署user212658的hack的方法
将这些行放在您的文件中:
这对我很有效。更好的修复方法是删除atlas并安装openblas。openblas比atlas更快。此外,openblas不请求gfortran,它是numpy链接的对象。因此,它将开箱即用。@Framester,如前所述,如果您刚刚安装了pythonnumpy,则没有用于构建它的文件。您将需要apt-get-source…+apt-get-build-dep…,然后编译并安装。为了让ubuntu 100%干净,你可能想构建一个包,但不知道需要做什么。我仍然在努力手动安装numpy。不幸的是,这是离线自动取款机。再次感谢您的提示。我试图跟随他们,但我仍然收到相同的错误。请参阅更新。(两者都已经+1)哦,我刚刚看到,我忽略了apt-get-source…+apt-get-build-dep版本。我现在正在试,谢谢!不幸的是,我无法测试它,因为我重新安装了所有东西以使其工作+1无论如何
Nick@some-serv2:/usr/local/lib/python2.6/dist-packages/numpy$ python setup.py build --help-fcompiler
This is the wrong setup.py file to run
class GCC_compiler(object):
...
@staticmethod
def compile_str(module_name, src_code, location=None,
include_dirs=None, lib_dirs=None, libs=None,
preargs=None):
...
cmd.extend(['-l%s' % l for l in libs])
if 'blas' in libs:
cmd.append('-lgfortran')
[blas]
ldflags = -lblas -lgfortran