Невозможно использовать f2py для компоновки большого кода PETSc/SLEPc Fortran.

Я пытаюсь использовать f2py для создания модуля python для моего кода Fortran, который использует как PETSc, так и SLEPc (этот вопрос очень тесно связан с это сообщение, но обсуждение там не смогло решить мою проблему - см. комментарии внизу этого сообщения). Код состоит из множества файлов и подпрограмм, но мне нужен доступ только к самой внешней функции main/driver в python. Первым шагом, который я предпринял, было использование предоставленного SLEPc шаблона make-файла для создания всех объектных файлов (окончательная компоновка не удалась, потому что внешняя функция теперь является подпрограммой, а не основной программой, но пока я не беспокоюсь об этом, так как я я как раз после объектных файлов).

Оттуда я попробовал два подхода. Первый — просто вызвать f2py следующим образом:

f2py -c -m modname outer_driver.f90 file1.o file2.o file3.o...

Кажется, это работает, но при попытке импорта в python объекты/функции SLEPc (и, я полагаю, PETSc) не могут быть найдены:

>>> import mod_name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(./mod_name.so, 2): Symbol not found: _epscreate_
  Referenced from: ./mod_name.so
  Expected in: flat namespace
 in ./mod_name.so

Второй подход предполагает, что мне также нужно связать библиотеки SLEPc/PETSc. Таким образом, я добавил строку в свой make-файл:

modname.so: outer_driver.f90
        f2py -c -m modname outer_driver.f90 file1.o file2.o file3.o ${SLEPC_EPS_LIB}

После запуска «make modname.so» f2py не может работать полностью. Вот результат этого:

running build
running config_cc
unifing config_cc, config, build_clib, build_ext, build commands --compiler options
running config_fc
unifing config_fc, config, build_clib, build_ext, build commands --fcompiler options
running build_src
build_src
building extension "modname" sources
f2py options: []
f2py:> /tmp/tmpIH70ZJ/src.macosx-10.10-x86_64-2.7/modnamemodule.c
creating /tmp/tmpIH70ZJ/src.macosx-10.10-x86_64-2.7
Reading fortran codes...
    Reading file 'outer_driver.f90' (format:free)
Post-processing...
    Block: modname
            Block: outer_driver
Post-processing (stage 2)...
Building modules...
    Building module "modname"...
        Constructing wrapper function "outer_driver"...
          outer_driver()
    Wrote C/API module "modname" to file "/tmp/tmpIH70ZJ/src.macosx-10.10-x86_64-2.7/modnamemodule.c"
  adding '/tmp/tmpIH70ZJ/src.macosx-10.10-x86_64-2.7/fortranobject.c' to sources.
  adding '/tmp/tmpIH70ZJ/src.macosx-10.10-x86_64-2.7' to include_dirs.
copying /usr/local/lib/python2.7/site-packages/numpy/f2py/src/fortranobject.c -> /tmp/tmpIH70ZJ/src.macosx-10.10-x86_64-2.7
copying /usr/local/lib/python2.7/site-packages/numpy/f2py/src/fortranobject.h -> /tmp/tmpIH70ZJ/src.macosx-10.10-x86_64-2.7
build_src: building npy-pkg config files
running build_ext
customize UnixCCompiler
customize UnixCCompiler using build_ext
customize Gnu95FCompiler
Found executable /usr/local/bin/gfortran
customize Gnu95FCompiler
customize Gnu95FCompiler using build_ext
building 'modname' extension
compiling C sources
C compiler: clang -fno-strict-aliasing -fno-common -dynamic -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes

error: unknown file type '' (from '-Wl,-rpath,/usr/local/Cellar/slepc/3.7.3_4/real/lib')
make: *** [modname.so] Error 1

OP Использование f2py в коде fortran, связанном с PETSc< В сообщении /a> говорится, что он смог обойти использование флагов -Wl,-rpath, которые здесь также представляют проблему, установив переменную окружения LD_LIBRARY_PATH в библиотеку PETSc. Однако, если я сделаю то же самое (установлю библиотеку SLEPc, что, как я полагаю, также подразумевает библиотеку PETSc), мне не поможет ни один из этих подходов. Может ли кто-нибудь предложить подход, который я мог бы использовать?

ОБНОВЛЕНИЕ. Было запрошено немного дополнительной информации об ошибке -Wl,rpath и ее происхождении. Насколько я понимаю, эти флаги исходят от использования связи SLEPc/PETSc. Итак, в моем make-файле они берутся из переменной ${SLEPC_EPS_LIB}. В интерпретации полная команда очень длинная, но я все равно включу ее на случай, если оттуда можно будет что-то добыть. Имейте в виду, я не использовал настоящие имена файлов в своих примерах выше — я просто упростил для ясности. Ниже имена файлов будут другими.

РЕШЕНО. В конечном итоге мне удалось найти несколько способов обойти эту проблему. Самый простой, по сути, такой же, как и второй подход (на основе make-файла), который я описываю, но я вручную удаляю каждую команду -Wl,rpath из переменной SLEPC_EPS_LIB. Кроме того, из списка рассылки PETSc я узнал, что f2py можно использовать только для создания необходимых файлов .c, .f90 и .pyc. Затем вы можете скомпилировать себя, связав необходимые библиотеки. Очевидно, что это более сложно, но это тоже вариант.

f2py предназначался для GCC, у вас есть clang. Должно ли это работать в любом случае?


person aherrema    schedule 23.03.2017    source источник
comment
Покажите нам, как вы использовали -Wl,-rpath. В какой файл ты это поместил? Покажите нам этот файл. Я не понимаю ошибку ошибка: неизвестный тип файла '' (из '-Wl,-rpath,/usr/local/Cellar/slepc/3.7.3_4/real/lib')   -  person Vladimir F    schedule 23.03.2017
comment
Итак, вы поместили Wlrpath в переменную окружения или она уже была там? Какая переменная? Что происходит, когда вы удаляете его?   -  person Vladimir F    schedule 23.03.2017
comment
Сообщение отредактировано, чтобы показать, откуда взялись _1_. Я не уверен в проблеме GCC/clang. Возможно, выбор одного или другого возможен в _2_?   -  person Vladimir F    schedule 23.03.2017
comment
Я сам не добавляю Wl,rpathrpath` в переменную окружения — эта переменная окружения в основном поставляется с SLEPc. Если я его не включу, то связка f2py работает и создает iga_blade_py.so, но когда я пытаюсь импортировать его в python, я получаю ту же ошибку, что и в первом описанном мной случае (объекты SLEPc/PETSc не распознаются).   -  person aherrema    schedule 23.03.2017
comment
Для выбора gcc или clang система сборки часто использует переменную -Wl,, например, набрав _2_. Часто при программировании на разных языках хорошо иметь одного поставщика для всего (например, gcc/gfortran или icc/ifort).   -  person aherrema    schedule 23.03.2017
comment
f2py -c -m iga_blade_py run_analysis.f90 modules.o force.o param.o cname.o curve_input_nrb_mc.o shell_input_nrb_mp.o shell_reduce_node.o shell_input_nrb.o material_input.o material_calculate.o shell_laminate2.o iosol.o shell_gp_info.o shell_profile_vector. o shell_genIEN_INN.o shell_genSparStruc.o shell_genGP_GW.o shell_eval_SHAPE.o shell_dersbasisfuns.o shell_e3LRhs_KLShell.o shell_e3LRhs_KLShell_pen_disp.o shell_e3LRhs_KLShell_pen_rot.o shell_KL_geo.o cross_prod.o shell_BCLhs_3D.o shell_FillSparseMat_3D.o shell_SparseMatLoc_3D.o shell_SparseCG.o shell_skyline.o shell_SparseProd.o shell_IntElmAss_post2 .o shell_e3LRhs_KLShell_post.o curve_element_project.o shell_mnrb_find_search_locs.o shell_nrb_find_point.o patch_point_proj.o petsc_genSparStruc.o viz_read_mesh_points.o driver.o input_shell.o solflow.o shell_IntElmAss.o petsc_fillMat.o shell_IntElmAss_pen.o petsc_prepSolve.o shell_allocate_LRhs.o petsc_rank.o solflow_lin_buck.o solflow_vibr.o shell_IntElmAss_mass.o -Wl,-rpath,/usr/loca l/Cellar/slepc/3.7.3_4/real/lib -L/usr/local/Cellar/slepc/3.7.3_4/real/lib -lslepc -Wl,-rpath,/usr/local/opt/arpack/lib - L/usr/local/opt/arpack/lib -lparpack -larpack -Wl,-rpath,/usr/local/Cellar/petsc/3.7.5/real/lib -L/usr/local/Cellar/petsc/3.7. 5/real/lib -lpetsc -L/usr/local/opt/superlu_dist/lib -lsuperlu_dist -Wl,-rpath,/usr/local/opt/mumps/libexec/lib -L/usr/local/opt/mumps/ libexec/lib -lcmumps -ldmumps -lsmumps -lzmumps -lmumps_common -lpord -Wl,-rpath,/usr/local/opt/parmetis/lib -L/usr/local/opt/parmetis/lib -lparmetis -Wl,-rpath ,/usr/local/opt/metis/lib -L/usr/local/opt/metis/lib -lmetis -Wl,-rpath,/usr/local/opt/hypre/lib -L/usr/local/opt/ hypre/lib -lHYPRE -Wl,-rpath,/usr/local/opt/libevent/lib -L/usr/local/opt/libevent/lib -Wl,-rpath,/usr/local/Cellar/open-mpi/ 2.0.2/lib -L/usr/local/Cellar/open-mpi/2.0.2/lib -Wl,-rpath,/usr/local/lib -L/usr/local/lib -Wl,-rpath,/ Система/Библиотека/Фреймворки/OpenGL.framework/Версии/Текущие/Библиотеки -L/Система/Библиотека/Фреймворки/OpenGL.fra mework/Versions/Current/Libraries -Wl,-rpath,/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/8.0.0/lib/darwin -L/Applications/Xcode. app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/8.0.0/lib/darwin -lclang_rt.osx -lc++ -Wl,-rpath,/Applications/Xcode.app/Contents/Developer/Toolchains/ XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/lib/darwin -L/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/. ./lib/clang/8.0.0/lib/darwin -lclang_rt.osx -Wl,-rpath,/usr/local/opt/scalapack/lib -L/usr/local/opt/scalapack/lib -lscalapack -Wl, -rpath,/usr/local/opt/suite-sparse/lib -L/usr/local/opt/suite-sparse/lib -lumfpack -lklu -lcholmod -lbtf -lccolamd -lcolamd -lcamd -lamd -lsuitesparseconfig -Wl, -rpath,/usr/local/opt/солнечные часы/lib -L/usr/local/opt/солнечные часы/lib -lsundials_cvode -lsundials_nvecserial -lsundials_nvecparallel -llapack -lblas -Wl,-rpath,/usr/local/opt/netcdf/ lib -L/usr/local/opt/netcdf/lib -lnetcdf -Wl,-rpath,/usr/local/opt/hdf5/lib -L/usr/local/opt/hdf5/lib -lhdf5_hl -lhdf5 -Wl, -rpath,/usr/local/opt/hwloc/lib -L/usr/local/opt/hwloc/lib -lhwloc -Wl,-rpath,/usr/local/opt/fftw/lib -L/usr/local/ opt/fftw/lib -lfftw3_mpi -lfftw3 -lmpi_usempif08 -lmpi_usempi_ignore_tkr -lmpi_mpifh -lgfortran -Wl,-rpath,/usr/local/Cellar/gcc/6.3.0_1/lib/gcc/6/gcc/x86_64-apple-darwin15. 6.0/6.3.0 -L/usr/local/Cellar/gcc/6.3.0_1/lib/gcc/6/gcc/x86_64-apple-darwin15.6.0/6.3.0 -Wl,-rpath,/usr/local/ Подвал/gcc /6.3.0_1/lib/gcc/6 -L/usr/local/Cellar/gcc/6.3.0_1/lib/gcc/6 -lgfortran -lgcc_ext.10.5 -lquadmath -lm -lclang_rt.osx -lc++ -lclang_rt.osx -Wl,-rpath,/usr/local/opt/libevent/lib -L/usr/local/opt/libevent/lib -Wl,-rpath,/usr/local/Cellar/open-mpi/2.0.2/lib -L/usr/local/Cellar/open-mpi/2.0.2/lib -Wl,-rpath,/usr/local/lib -L/usr/local/lib -Wl,-rpath,/System/Library/Frameworks /OpenGL.framework/Versions/Current/Libraries -L/System/Library/Frameworks/OpenGL.framework/Versions/Current/Libraries -ldl -lmpi -lSystem -Wl,-rpath,/Applications/Xcode.app/Contents/Developer /Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/lib/darwin -L/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/.. /lib/clang/8.0.0/lib/darwin -lclang_rt.osx -ldl   -  person Pierre de Buyl    schedule 28.03.2017