由于Ubuntu下的NumPy 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),但这没有帮助 你建议

我在我的机器上安装了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
),但这没有帮助

你建议采取什么步骤

完整错误消息: 我的研究: 关于
未定义符号的页面:\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