2013-10-11 3 views
6

Я пытаюсь использовать f2py для сопряжения моих программ python с моими модулями Fortran.f2py с компилятором Intel Fortran

Я на платформе Win7.

Я использую последнюю версию Anaconda 64 (1.7) как стек Python + NumPy.

Мой компилятор Fortran - это новейший компилятор Intel Fortran 64 (версия 14.0.0.103 Build 20130728).

я испытывал ряд вопросов при выполнении f2py -c -m PyModule FortranModule.f90 --fcompiler=intelvem

Последний, который я не могу показаться, чтобы разобраться в том, что она выглядит как последовательность флагов f2py/Distutils переходит на компилятор не соответствуют ожиданиям ifort.

Я получаю серию предупреждающих сообщений об неизвестных параметрах при вызове ifort.

ifort: command line warning #10006: ignoring unknown option '/LC:\Anaconda\libs' 
ifort: command line warning #10006: ignoring unknown option'/LC:\Anaconda\PCbuild\amd64' 
ifort: command line warning #10006: ignoring unknown option '/lpython27' 

Я подозреваю, что это связано с ошибками, которые я получаю от линкера в конце

error LNK2019: unresolved external symbol __imp_PyImport_ImportModule referenced in function _import_array 
error LNK2019... and so forth (there are about 30-40 lines like that, with different python modules missing) 

и заключает с простой

fatal error LNK1120: 42 unresolved externals 

Я предполагаю, что это происходит потому, в последовательности параметров отсутствует флаг/link. Из-за этого параметры/l/L не передаются компоновщику, и компилятор считает, что они адресованы ему.

Команда ifort генерируется f2py выглядит следующим образом:

ifort.exe -dll -dll Pymodule.o fortranobject.o FortranModule.o module-f2pywrappers2.o -LC:\Anaconda\libs -LC:\Anaconda\PCbuild\amd64 -lPython27 

Я понятия не имею, почему «-dll» повторяется дважды (я должен был изменить этот флаг с оригинала «-shared»).

Теперь я попытался изучить коды f2py и distutils, но не понял, как добавить дополнительную/ссылку в выход команды. Я даже не смог найти, где генерируется этот вывод.

Если кто-то столкнулся с этой проблемой в прошлом и/или может иметь некоторые предложения, я бы очень ее оценил.

Спасибо за ваше время

+1

я столкнулся такие проблемы, но, к сожалению, я не мог найти пути вокруг них; Я закончил создание Makefile, который собрал все вместе. Вот Makefile: http://pastebin.com/ChSxLzSb. – bdforbes

+0

Спасибо за файл! У меня появилась возможность взглянуть на это только сегодня. В конечном итоге это была огромная боль, чтобы заставить ее работать из-за большого количества путов и различных файлов для извлечения. Но, в конце концов, я смог сделать то, что хотел. Я думаю, что очень сложно придумать окончательный ответ, поскольку он, похоже, сильно зависит от установленных платформ и цепей инструментов. – Tesla

+0

Итак, каков был ваш подход в конце? Удалось ли вам перехватить distutils? – bdforbes

ответ

0

Библиотека путь задается с помощью/LIBPATH не/L

+0

Спасибо. Извините за позднюю обратную связь, я не заметил комментариев в феврале ... Это на самом деле не отвечает на вопрос. Фактически, для ifort это будет/libdir. Реальный вопрос: «Как вы изменили способ, которым dist-utils генерирует список аргументов компилятора?». На данный момент решение bdforbes по использованию make-файла работает, но было бы неплохо, если бы f2py мог просто обработать все это. – Tesla

3

я столкнулся с подобными проблемами с моим собственным кодом некоторое время назад. Если я правильно понимаю комментарии, вы уже использовали подход, который работал для меня, поэтому это просто означает уточнение и резюме для всех тех, кто борется с f2py и зависимостями:

У f2py, кажется, есть проблемы с разрешением зависимостей от внешних исходных файлов , Если внешние зависимости передаются в f2py как уже скомпилированные объектные файлы, то соединение прекрасно работает, и библиотека python получает сборку без проблем.

Самым простым решением поэтому кажется:

  1. компиляции всех зависимостей в объектные файлы (*.о), используя вашу предпочитаемый компилятор и компилятор настройку
  2. пройти все объектные файлы f2py вместе с исходного файлом вашего основной подпрограммы/функция/модуля/...
  3. использования созданной библиотеки питона, как и ожидалось

простой Skript питон может выглядеть следующим образом (pycompile.py):

#!python.exe 
# -*- coding: UTF-8 -*- 
import os 
import platform 
'''Uses f2py to compile needed library''' 
# build command-strings 
# command for compling *.o and *.mod files 
fortran_exe = "gfortran " 
# fortran compiler settings 
fortran_flags = "<some_gfortran_flags> " 
# add path to source code 
fortran_source = ("./relative/path/to/source_1.f90 " 
        "C:/absolut/path/to/source_2.f90 "     
        "...") 
# assemble fortran command 
fortran_cmd = fortran_exe + fortran_flags + fortran_source 

# command for compiling main source file using f2py 
f2py_exe = "f2py -c " 
# special compiler-options for Linux/ Windows 
if (platform.system() == 'Linux'): 
    f2py_flags = "--compiler=unix --fcompiler=gnu95 " 
elif (platform.system() == 'Windows'): 
    f2py_flags = "--compiler=mingw32 --fcompiler=gnu95 " 
# add path to source code/ dependencies 
f2py_source = ("-m for_to_py_lib " 
       "./path/to/main_source.f90 " 
       "source_1.o " 
       "source_2.o " 
       "... " 
       ) 
# assemble f2py command 
f2py_cmd = f2py_exe + f2py_flags + f2py_source 

# compile .o and .mod files 
print "compiling object- and module-files..." 
print 
print fortran_cmd 
os.system(fortran_cmd) 
# compile main_source.f90 with f2py 
print "================================================================" 
print "start f2py..." 
print 
print f2py_cmd 
os.system(f2py_cmd) 

более гибкое решение для л ArGe проекты могут быть обеспечены с помощью Makefile, а dicussed по @bdforbes в комментариях (for reference) или пользовательского CMake команду пользователя в сочетании с выше Skript:

############################################################################### 
# General project properties 
################################################################################ 
# Set Project Name 
project (for_to_py_lib) 
# Set Version Number 
set (for_to_py_lib_VERSION_MAJOR 1) 
set (for_to_py_lib_VERSION_MINOR 0) 
# save folder locations for later use/ scripting (see pycompile.py) 
# relative to SOURCE folder 
set(source_root ${CMAKE_CURRENT_LIST_DIR}/SOURCE) # save top level source dir for later use 
set(lib_root ${CMAKE_CURRENT_LIST_DIR}/LIBRARIES) # save top level lib dir for later use 
# relative to BUILD folder 
set(build_root ${CMAKE_CURRENT_BINARY_DIR}) # save top level build dir for later use 

### 
### Fortran to Python library 
### 
find_package(PythonInterp) 
if (PYTHONINTERP_FOUND) 
    # copy python compile skript file to build folder and substitute CMake variables 
    configure_file(${source_root}/pycompile.py ${build_root}/pycompile.py @ONLY) 
    # define for_to_py library ending 
    if (UNIX) 
     set(CMAKE_PYTHON_LIBRARY_SUFFIX .so) 
    elseif (WIN32) 
     set(CMAKE_PYTHON_LIBRARY_SUFFIX .pyd) 
    endif() 
    # add custom target to ALL, building the for_to_py python library (using f2py) 
    add_custom_target(for_to_py ALL 
         DEPENDS ${build_root}/for_to_py${CMAKE_PYTHON_LIBRARY_SUFFIX}) 
    # build command for python library (execute python script pycompile.py containing the actual build commands) 
    add_custom_command(OUTPUT ${build_root}/for_to_py${CMAKE_PYTHON_LIBRARY_SUFFIX} 
         COMMAND ${PYTHON_EXECUTABLE} ${build_root}/pycompile.py 
         WORKING_DIRECTORY ${build_root} 
         DEPENDS ${build_root}/pycompile.py 
           ${source_root}/path/to/source_1.f90 
           ${source_root}/path/to/source_2.f90 
           ${source_root}/INOUT/s4binout.f90 
         COMMENT "Generating fortran to python library") 
    # post build command for python library (copying of generated files) 
    add_custom_command(TARGET for_to_py 
         POST_BUILD 
         COMMAND ${CMAKE_COMMAND} -E copy_if_different 
           ${build_root}/s4_to_py${CMAKE_PYTHON_LIBRARY_SUFFIX} 
           ${lib_root}/for_to_py${CMAKE_PYTHON_LIBRARY_SUFFIX} 
         COMMENT "\ 
***************************************************************************************************\n\ 
copy of python library for_to_py${CMAKE_PYTHON_LIBRARY_SUFFIX} placed in ${lib_root}/for_to_py${CMAKE_PYTHON_LIBRARY_SUFFIX} \n\ 
***************************************************************************************************" 
         ) 
endif (PYTHONINTERP_FOUND) 

с модифицированным pycompile:

#!python.exe 
# -*- coding: UTF-8 -*- 
... 
fortran_source = ("@[email protected]/source_1.f90 " 
        "@[email protected]/source_2.f90 "     
        "...") 
... 
# add path to source code/ dependencies 
f2py_source = ("-m for_to_py_lib " 
       "@[email protected]/for_to_py.f90 " 
       "source_1.o " 
       "source_2.o " 
       "... " 
       ) 
... 

# compile .o and .mod files 
... 
Смежные вопросы