Python调用C/Fortran混合的动态链接库-下篇

接着前面的内容,我们在这里继续介绍Python传递二维数组到fortran并进行简单计算后返回的例子。

问题描述:

Python的NumPy定义二维数组传递到Fortran程序计算后返回


限制条件:

  1. Python中必须确定数组的大小即维数
  2. Python中用NumPy定义的数组存储方式必须是Fortran的按列存储

实现方式:

Python中使用NumPy定义Fortran方式存储的二维数组,利用ndpointer定义数组类型和维数,将二维数组的首地址和维数信息传入Fortran中进行计算并返回

附注:NumPy的ndarray提供了ctypes模块,可以调用其data属性将数组首地址传入

参考链接:

原来Numpy的array可以很方便地和ctypes结合起来使用

Fortran代码:

 1 module py2f90
 2 use,intrinsic::iso_c_binding
 3 implicit none
 4 contains
 5     subroutine transferMat2For(matrix,n1,n2)bind(c,name=‘array2py‘)
 6     implicit none
 7     integer(c_int),intent(in),value::n1,n2
 8     real(c_float),intent(out)::matrix(n1,n2)
 9
10     integer::i,j
11     ! initialize matrix
12     matrix = 0.0E0
13     ! loop
14     do i=1,n1
15         do j=1,n2
16             matrix(i,j) = real(i,4)*1.E1+real(j,4)*2.E0
17             write(*,"(‘Row:‘,i4,1x,‘Col:‘,i4,1x,‘Value:‘,1x,F5.2)")i,j,matrix(i,j)
18         enddo
19     enddo
20     return
21     end subroutine
22 end module
23
24 program test
25 use py2f90
26 implicit none
27 real(kind=4)::aa(4,5)
28 call transferMat2For(aa,4,5)
29 end program

Python代码:

 1 #! /usr/bin/env python
 2 #coding=utf-8
 3
 4 import numpy as np
 5 from numpy.ctypeslib import load_library,ndpointer
 6 from ctypes import c_int
 7
 8 # shape of 2d array
 9 n1,n2 = 2,4+1
10 # create an empty 2d array
11 data = np.empty(shape=(n1,n2),dtype=‘f4‘,order=‘f‘)
12
13 flib = load_library("test","./")
14 flib.argtypes = [ndpointer(dtype=‘f4‘,ndim=2),c_int,c_int]
15 flib.array2py(data.ctypes.data,n1,n2)
16 print "*"*80
17 print data

编译指令:

gfortran ctypes2d_array_test.f90 -fPIC -shared -o test.so

运行结果:

[email protected]:~/fortran_code$ python py2f90_test.py
Row:   1 Col:   1 Value: 12.00
Row:   1 Col:   2 Value: 14.00
Row:   1 Col:   3 Value: 16.00
Row:   1 Col:   4 Value: 18.00
Row:   1 Col:   5 Value: 20.00
Row:   2 Col:   1 Value: 22.00
Row:   2 Col:   2 Value: 24.00
Row:   2 Col:   3 Value: 26.00
Row:   2 Col:   4 Value: 28.00
Row:   2 Col:   5 Value: 30.00
********************************************************************************
[[ 12.  14.  16.  18.  20.]
 [ 22.  24.  26.  28.  30.]]

?

时间: 2024-10-20 15:49:02

Python调用C/Fortran混合的动态链接库-下篇的相关文章

Python调用C/Fortran混合的动态链接库--上篇

内容描述: 在32位或64位的windows或GNU/Linux系统下利用Python的ctypes和numpy模块调用C/Fortran混合编程的有限元数值计算程序 操作系统及编译环境: 32bit Win7 + mingw32 + gcc-4.8 + msys-1.0 + python2.7 + openblas-0.2.8 64bit Ubuntu 1404 + gcc-4.8 + python2.7 + openblas-0.2.8 任务分解: 1.打包有限元数值程序,生成dll或so格

Python调用C的DLL(动态链接库)

开发环境:mingw64位,python3.6 64位 参考博客: mingw编译dll: https://blog.csdn.net/liyuanbhu/article/details/42612365 python调用dll: https://www.cnblogs.com/cnpirate/p/5939446.html 编写 dlltest.c //dlltest.c int Double(int x) { return x * 2; } 编译为dll gcc dlltest.c -sha

Python调用DLL动态链接库——ctypes使用

最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用. ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调用函数. 一.Python调用DLL里面的导出函数 1.VS生成dll 1.1 新建动态链接库项目 1.2 在myTest.cpp中输入以下内容: // myTest.cpp : 定义 DLL 应用程序的导出函数. // #include "stdafx.h" #define DLLEXP

[转载:]C#与Fortran混合编程之本地调用Fortran动态链接库

前言 C#发展到现在,已是一门相当完善的语言,他基于C语言风格,演化于C++.并依靠强大的.NET底层框架.C#可以用来快速构建桌面及Web应用.然而在我们的实际工作中,尽管C#已经非常完善,但还是不能完成我们所有的工作.在很多工程计算中,C#语言的计算速度,精度,以及执行效率相对来说都达不到项目的要求.因此我们便考虑是否有一种方式将我们的工程计算部分和我们的项目分开,将计算部分用另一种执行更快,精度更高的语言来编写,然后在C#中调用,最后完成我们的工作.答案是肯定的. Fortran是一门古老

用python调用C的动态链接库

暂时Python写得不好,有些东西还是用C写起来顺手,遇到这种情况怎么办呢…于是学习了一下python调用C动态链接库的方法.这样就可以将用C写好的函数提供给python使用了. 首先要将先新建个DLL工程.例如我新建了dlllearning工程,内包含example.h和example.cpp两个文件. 代码如下: 1 //example.h 2 #ifndef EXPORT_EXAMPLE_DLL 3 #define EXAMPLE_API __declspec(dllimport) 4 #

Python调用C/C++动态链接库的方法

本文以实例讲解了Python调用C/C++ DLL动态链接库的方法,具体示例如下: 示例一: 首先,在创建一个DLL工程(本例创建环境为VS 2005),头文件: //hello.h #ifdef EXPORT_HELLO_DLL #define HELLO_API __declspec(dllexport) #else #define HELLO_API __declspec(dllimport) #endif extern "C" { HELLO_API int IntAdd(in

python调用C动态链接库

Python调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可. 1. C语言文件:pycall.c #include <stdio.h> #include <stdlib.h> int foo(int a, int b) { printf("you input %d and %d\n",a,b); return a+b; } 2. gcc编译成动态库libpycall.so: gcc -o libpycall.so -shar

Python调用(运行)外部程序

在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32process模块中的函数.如果想进一步控制进程,则可以使用ctype模块,直接调用kernel32.dll中的函数. 1 使用os.system函数运行其他程序2 使用ShellExecute函数运行其他程序3 使用CreateProcess函数运行其他程序4 使用ctypes调用kernel32.dl

linux下python调用c模块

在C调用Python模块时需要初始化Python解释器,导入模块等,但Python调用C模块却比较简单,下面还是以helloWorld.c 和 main.py 做一说明:   (1)编写C代码,hello.c代码很简单,只是输出“Hello World!”:         (2)将编写的C代码编译成动态链接库的形式,具体命令:   此时在当前目录下就生成了libhello.so 的动态链接库:         (3)在main.py中导入动态链接库,并调用C函数 这里的ctypes是Pytho