安装Scipy 1.0.0触发AssertionError报错求助
解决Scipy 1.0.0源码安装时的AssertionError问题
问题场景
- 适配GATK软件,在conda环境中准备安装Scipy 1.0.0
- 已按GATK提供的yml配置了Python 3.6.10和Numpy 1.17.5
- 执行
python setup.py build时触发AssertionError,报错栈如下:
f2py: build/src.linux-x86_64-3.6/scipy/linalg/flapack.pyf Reading fortran codes... Reading file 'build/src.linux-x86_64-3.6/scipy/linalg/flapack.pyf' (format:free) Traceback (most recent call last): File "setup.py", line 418, in <module> setup_package() File "setup.py", line 414, in setup_package setup(**metadata) File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/site-packages/numpy/distutils/core.py", line 171, in setup return old_setup(**new_attr) File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/site-packages/setuptools/__init__.py", line 153, in setup return distutils.core.setup(**attrs) File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/distutils/core.py", line 148, in setup dist.run_commands() File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/distutils/dist.py", line 955, in run_commands self.run_command(cmd) File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/distutils/dist.py", line 974, in run_command cmd_obj.run() File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/site-packages/numpy/distutils/command/build.py", line 47, in run old_build.run(self) File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/distutils/command/build.py", line 135, in run self.run_command(cmd_name) File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/distutils/cmd.py", line 313, in run_command self.distribution.run_command(command) File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/distutils/dist.py", line 974, in run_command cmd_obj.run() File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/site-packages/numpy/distutils/command/build_src.py", line 142, in run self.build_sources() File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/site-packages/numpy/distutils/command/build_src.py", line 159, in build_sources self.build_extension_sources(ext) File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/site-packages/numpy/distutils/command/build_src.py", line 319, in build_extension_sources sources = self.f2py_sources(sources, ext) File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/site-packages/numpy/distutils/command/build_src.py", line 535, in f2py_sources + ['--build-dir', target_dir, source]) File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/site-packages/numpy/f2py/f2py2e.py", line 425, in run_main postlist = callcrackfortran(files, options) File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/site-packages/numpy/f2py/f2py2e.py", line 330, in callcrackfortran postlist = crackfortran.crackfortran(files) File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/site-packages/numpy/f2py/crackfortran.py", line 3251, in crackfortran readfortrancode(files, crackline) File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/site-packages/numpy/f2py/crackfortran.py", line 501, in readfortrancode dowithline(finalline) File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/site-packages/numpy/f2py/crackfortran.py", line 796, in crackline analyzeline(m, pat[1], line) File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/site-packages/numpy/f2py/crackfortran.py", line 1098, in analyzeline last_name = updatevars(typespec, selector, attr, edecl) File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/site-packages/numpy/f2py/crackfortran.py", line 1542, in updatevars attrspec = [x.strip() for x in markoutercomma(attrspec).split('@,@')] File "/home/joyzheng/.conda/envs/gatk4.3/lib/python3.6/site-packages/numpy/f2py/crackfortran.py", line 833, in markoutercomma assert not f, repr((f, line, l)) AssertionError: (-1, 'intent(in))', 'intent(in))')
问题原因
Numpy 1.17.5的f2py模块对Fortran代码的语法检查更严格,而Scipy 1.0.0的源码生成的.pyf文件中存在语法错误(多余的右括号:intent(in))),导致解析时触发断言失败。
解决方案
方案1:降级Numpy到兼容版本
Scipy 1.0.0官方兼容的Numpy版本范围是1.13.3~1.16.x,降级到该范围内的版本即可避免兼容性问题:
- 执行conda命令降级Numpy:
conda install numpy=1.16.6 - 重新编译安装Scipy:
python setup.py build && python setup.py install
方案2:修复Scipy源码中的语法错误
直接修改生成的.pyf文件中的语法问题:
- 定位到报错文件:
build/src.linux-x86_64-3.6/scipy/linalg/flapack.pyf - 在文件中搜索
intent(in)),将所有出现的该内容修改为intent(in) - 重新执行编译命令:
python setup.py build
内容的提问来源于stack exchange,提问作者Joy Zheng
相关产品推荐
相关产品推荐

