在包含f2py(最小工作示例)的模块中包含已编译的模块?

前端之家收集整理的这篇文章主要介绍了在包含f2py(最小工作示例)的模块中包含已编译的模块?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经尝试过但是失败了,以获得最低限度的工作示例.因为我不需要将我的大量代码暴露给 python,所以我不需要f2py来包装它的大部分内容.此外,由于传递可分配数组和使用派生类型,我特别希望f2py只包装我创建的接口模块(在下面的示例’main.f90’中).但是我有问题要把我单独编译的其他模块链接到我的主模块.

代码

请注意,所有源文件都在一个目录中.

我创建了一个我想要编译的fortran模块(libtest.f90):

  1. module testmod
  2. implicit none
  3. contains
  4.  
  5. subroutine testsub(arr)
  6. real,allocatable,intent(in) :: arr(:,:)
  7. print *,'testsub executed'
  8. end subroutine testsub
  9.  
  10. end module testmod

和一个我想用f2py(main.f90)包装的fortran模块:

  1. module mainmod
  2.  
  3. use testmod
  4. implicit none
  5. contains
  6.  
  7. subroutine mainsub
  8. real,allocatable :: arr(:,:)
  9. call testsub(arr)
  10. end subroutine main sub
  11.  
  12. end module mainmod

我使用以下编译命令:

  1. gfortran -c -fPIC libtest.f90

生成’libtest.o’和’testmod.mod’,以及

  1. f2py -c --fcompiler=gfortran -L. -I. -llibtest -m Main main.f90

这给了我’ld:找不到-llibtest的库’.

我不明白为什么会这样,因为它似乎适用于其他人(F2PY doesn’t find a module).
如果我拿出-llibtest,我当然得到(在我的python脚本中):

  1. Traceback (most recent call last):
  2. File "./script.py",line 7,in <module>
  3. import Main
  4. ImportError: dlopen(/Users/gmueller/Workspace/Minimum_PySpin/Main.so,2): Symbol not found: ___testmod_MOD_testsub
  5. Referenced from: /Users/gmueller/Workspace/Minimum_PySpin/Main.so
  6. Expected in: dynamic lookup

编辑:注意我在OSX(10.9.5),如果有所不同(但它不应该,因为我不需要将任何-shared(linux)或-dynamiclib(osx)传递给gfortran,对吧? ).

这里是f2py的完整输出

  1. f2py -c --fcompiler=gfortran -L. -I. -llibtest -m Main main.f90
  2. Unknown vendor: "gfortran"
  3. running build
  4. running config_cc
  5. unifing config_cc,config,build_clib,build_ext,build commands --compiler options
  6. running config_fc
  7. unifing config_fc,build commands --fcompiler options
  8. running build_src
  9. build_src
  10. building extension "Main" sources
  11. f2py options: []
  12. f2py:> /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/Mainmodule.c
  13. creating /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7
  14. Reading fortran codes...
  15. Reading file 'main.f90' (format:free)
  16. Post-processing...
  17. Block: Main
  18. Block: mainmod
  19. In: :Main:main.f90:mainmod
  20. get_useparameters: no module testmod info used by mainmod
  21. Block: mainsub
  22. In: :Main:main.f90:mainmod:mainsub
  23. get_useparameters: no module testmod info used by mainsub
  24. Post-processing (stage 2)...
  25. Block: Main
  26. Block: unknown_interface
  27. Block: mainmod
  28. Block: mainsub
  29. Building modules...
  30. Building module "Main"...
  31. Constructing F90 module support for "mainmod"...
  32. Constructing wrapper function "mainmod.mainsub"...
  33. mainsub()
  34. Wrote C/API module "Main" to file "/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/Mainmodule.c"
  35. Fortran 90 wrappers are saved to "/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/Main-f2pywrappers2.f90"
  36. adding '/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/fortranobject.c' to sources.
  37. adding '/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7' to include_dirs.
  38. copying /usr/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/f2py/src/fortranobject.c -> /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7
  39. copying /usr/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/f2py/src/fortranobject.h -> /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7
  40. adding '/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/Main-f2pywrappers2.f90' to sources.
  41. build_src: building npy-pkg config files
  42. running build_ext
  43. customize UnixCCompiler
  44. customize UnixCCompiler using build_ext
  45. customize Gnu95FCompiler
  46. Found executable /usr/local/bin/gfortran
  47. customize Gnu95FCompiler using build_ext
  48. building 'Main' extension
  49. compiling C sources
  50. C compiler: gcc -fno-strict-aliasing -fno-common -dynamic -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes
  51.  
  52. creating /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/var
  53. creating /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/var/folders
  54. creating /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/var/folders/yg
  55. creating /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq
  56. creating /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T
  57. creating /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8
  58. creating /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7
  59. compile options: '-I. -I/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7 -I/usr/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/include -I/usr/local/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c'
  60. gcc: /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/fortranobject.c
  61. In file included from /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/fortranobject.c:2:
  62. In file included from /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/fortranobject.h:13:
  63. In file included from /usr/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/include/numpy/arrayobject.h:4:
  64. In file included from /usr/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:17:
  65. In file included from /usr/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1804:
  66. /usr/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:15:2: warning: "Using deprecated NumPy API,disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-W#warnings]
  67. #warning "Using deprecated NumPy API,disable it by " \
  68. ^
  69. 1 warning generated.
  70. gcc: /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/Mainmodule.c
  71. In file included from /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/Mainmodule.c:17:
  72. In file included from /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/fortranobject.h:13:
  73. In file included from /usr/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/include/numpy/arrayobject.h:4:
  74. In file included from /usr/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:17:
  75. In file included from /usr/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1804:
  76. /usr/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:15:2: warning: "Using deprecated NumPy API,disable it by " \
  77. ^
  78. 1 warning generated.
  79. compiling Fortran 90 module sources
  80. Fortran f77 compiler: /usr/local/bin/gfortran -Wall -g -ffixed-form -fno-second-underscore -fPIC -O3 -funroll-loops
  81. Fortran f90 compiler: /usr/local/bin/gfortran -Wall -g -fno-second-underscore -fPIC -O3 -funroll-loops
  82. Fortran fix compiler: /usr/local/bin/gfortran -Wall -g -ffixed-form -fno-second-underscore -Wall -g -fno-second-underscore -fPIC -O3 -funroll-loops
  83. compile options: '-I. -I/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7 -I/usr/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/include -I/usr/local/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c'
  84. extra options: '-J/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/ -I/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/'
  85. gfortran:f90: main.f90
  86. compiling Fortran sources
  87. Fortran f77 compiler: /usr/local/bin/gfortran -Wall -g -ffixed-form -fno-second-underscore -fPIC -O3 -funroll-loops
  88. Fortran f90 compiler: /usr/local/bin/gfortran -Wall -g -fno-second-underscore -fPIC -O3 -funroll-loops
  89. Fortran fix compiler: /usr/local/bin/gfortran -Wall -g -ffixed-form -fno-second-underscore -Wall -g -fno-second-underscore -fPIC -O3 -funroll-loops
  90. compile options: '-I. -I/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7 -I/usr/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/include -I/usr/local/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c'
  91. extra options: '-J/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/ -I/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/'
  92. gfortran:f90: /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/Main-f2pywrappers2.f90
  93. /usr/local/bin/gfortran -Wall -g -Wall -g -undefined dynamic_lookup -bundle /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/Mainmodule.o /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/fortranobject.o /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/main.o /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/Main-f2pywrappers2.o -L. -L/usr/local/lib/gcc/x86_64-apple-darwin/4.8.2 -llibtest -lgfortran -o ./Main.so
  94. ld: library not found for -llibtest
  95. collect2: error: ld returned 1 exit status
  96. ld: library not found for -llibtest
  97. collect2: error: ld returned 1 exit status
  98. error: Command "/usr/local/bin/gfortran -Wall -g -Wall -g -undefined dynamic_lookup -bundle /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/Mainmodule.o /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/fortranobject.o /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/main.o /var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/var/folders/yg/65v1lbd153v1jlt1kb91vcbm0000gq/T/tmpJSf2e8/src.macosx-10.4-x86_64-2.7/Main-f2pywrappers2.o -L. -L/usr/local/lib/gcc/x86_64-apple-darwin/4.8.2 -llibtest -lgfortran -o ./Main.so" Failed with exit status 1

解决方法

你的命令:
  1. gfortran -c -fPIC libtest.f90

生成一个具有位置无关代码的目标文件.这是共享库的先决条件,而不是共享库.

如果要按原样使用该对象,可以修改f2py调用

  1. f2py -c --fcompiler=gfortran -I. libtest.o -m Main main.f90

这将链接目标文件生成文件Main.cpython-33.so(python版本号可能因您而异),然后您可以在python代码中导入main.

如果您希望实际生成共享对象,则需要编译到共享库.一种方法是:

  1. gfortran -shared -O2 -o libtest.so -fPIC libtest.f90

这会生成libtest.so,现在你的原始f2py命令可以使用一个小的改动:

  1. f2py -c --fcompiler=gfortran -L. -I. -ltest -m Main main.f90

我所指的小变化是将-llibtest更改为-ltest,因为-l选项会将lib添加到库的前端,然后到最后,例如. -ltest将查找libtest.so.这产生Main.cpython-33.so与libtest.so的动态链接依赖关系,因此您需要分发两个共享库才能使用python模块.

猜你在找的Python相关文章