利用numpy中的ctypeslib和python基础库ctypes调用fortran

目录

1、ubuntu18.04环境

2、win10环境

3、参考文章

上篇文章windows下python利用f2py调用Fortran我记录了利用numpy中的f2py调用fortran的方法,本文再介绍下在windows环境下,利用ctypeslib和ctypes调用fortran所踩过的坑。

基本的环境搭建参考上篇文章,这里就不再赘述,即安装好mingw-w64编译环境。

参考了博客园pasuka大神的文章Python调用C/Fortran混合的动态链接库-下篇,在ubuntu18.04环境下测试成功,但在windows下编译能成功,调用时却出了问题!

1、ubuntu18.04环境

ctypes2d_array_test.f90
module py2f90
use,intrinsic::iso_c_binding
implicit none
contains
    subroutine transferMat2For(matrix,n1,n2)bind(c,name='array2py')
    implicit none
    integer(c_int),intent(in),value::n1,n2
    real(c_float),intent(out)::matrix(n1,n2)

    integer::i,j
    ! initialize matrix
    matrix = 0.0E0
    ! loop
    do i=1,n1
        do j=1,n2
            matrix(i,j) = real(i,4)*1.E1+real(j,4)*2.E0
            write(*,"('Row:',i4,1x,'Col:',i4,1x,'Value:',1x,F5.2)")i,j,matrix(i,j)
        enddo
    enddo
    return
    end subroutine
end module

program test
use py2f90
implicit none
real(kind=4)::aa(4,5)
call transferMat2For(aa,4,5)
end program
py2f90_test.py
#! /usr/bin/env python
#coding=utf-8

import numpy as np
from numpy.ctypeslib import load_library,ndpointer
from ctypes import c_int

shape of 2d array
n1,n2 = 2,4+1
create an empty 2d array
data = np.empty(shape=(n1,n2),dtype='f4',order='f')

flib = load_library("test","./")
flib.argtypes = [ndpointer(dtype='f4',ndim=2),c_int,c_int]
flib.array2py(data.ctypes.data,n1,n2)
print("*"*80)
print(data)

用gfortran编译:

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

在ubuntu下运行正常:

利用numpy中的ctypeslib和python基础库ctypes调用fortran

2、win10环境

在win10环境下,编译指令:

gfortran py2f90.f90 -fPIC -shared -g -o test_mat.dll -fno-underscoring

编译能成功,但调用时出错:

利用numpy中的ctypeslib和python基础库ctypes调用fortran

错误定位到了第14行,flib.array2py(data.ctypes.data, n1, n2)这句,提示int too long to convert

但明明python3中,int是没有大小上限的,那为啥还会出现溢出错误呢?原因是fortran里的整数类型会出现溢出,其实我们的目的只是想把data这个numpy数组的首地址传递到fortran编写的array2py函数,这时可以用到ndarray.ctypes.data_as方法替换ndarray.ctypes.data属性,将py2f90_test.py代码做一些更改如下:

#coding=utf-8

from sys import flags
import numpy as np
from numpy.ctypeslib import load_library,ndpointer
from ctypes import c_int,POINTER,c_float

shape of 2d array
n1,n2 = 2,4+1
create an empty 2d array
data = np.empty(shape=(n1,n2),dtype='f4',order='f')

flib = load_library("test","./")
flib.argtypes = [ndpointer(dtype='f4',ndim=2),c_int,c_int]
flib.argtypes = [POINTER(c_float),c_int,c_int]
print(data.ctypes.data_as(POINTER(c_float)))
print(data.ctypes.data)
flib.array2py(data.ctypes.data_as(POINTER(c_float)),n1,n2)
flib.array2py(data.ctypes.data,n1,n2)
print("*"*80)
print(data)

运行结果如下:

利用numpy中的ctypeslib和python基础库ctypes调用fortran

可见用ndarray.ctypes.data_as方法比用ndarray.ctypes.data属性代码健壮性更好,既可以在linux下运行,也能在windows下运行,另外ndpointer和POINTER对代码的运行没什么影响,但ndpointer使用起来更灵活,因为既可以指定数组的返回值类型,也可以指定维度,更方便代码理解。

3、参考文章

Python调用C/Fortran混合的动态链接库-下篇利用numpy中的ctypeslib和python基础库ctypes调用fortranhttps://www.cnblogs.com/pasuka/p/4012508.html ;

Python使用ctypes模块调用DLL函数之C语言数组与numpy数组传递利用numpy中的ctypeslib和python基础库ctypes调用fortranhttps://baijiahao.baidu.com/s?id=1615404760897105428&wfr=spider&for=pc ;

Original: https://blog.csdn.net/qq_40420795/article/details/122489442
Author: CodeZeal
Title: 利用numpy中的ctypeslib和python基础库ctypes调用fortran

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/762905/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • python django ajax 上传图片后端搭建

    当前使用版本 django==2.2.17 pip install django==2.2.17 -i https://mirror.baidu.com/pypi/simple 1…

    Python 2023年8月5日
    036
  • Pandas数据处理 参数说明+实例解析!!

    Pandas缺失值处理 使用Numpy中的np.NaN或者np.nan -*- coding: UTF-8 -*- import pandas as pd import numpy…

    Python 2023年8月17日
    051
  • Pytest学习笔记(1)-快速入门

    快速入门 Pytest特点 Pytest是Python的一个第三方单元测试库。它的目的是让单元测试变得更容易,并且也能扩展到支持应用层面复杂的功能测试,特点有: 入门简单,易上手,…

    Python 2023年9月13日
    042
  • pandas的一些常规操作

    1.将 str 转换成 Timestamp new_time = pd.to_datetime(‘2019-01-01 00:51:00’) new_time Our[1]: Ti…

    Python 2023年8月8日
    042
  • python入门——实战项目1 外星人侵

    文章目录 目录 文章目录 前言 一、书上的一些难懂点 1.pygame的安装 2.整个项目的难懂点 二、在项目里遇到的一些小问题 1.顺序不能乱 2.更改一些项目中还有欠缺的地方 …

    Python 2023年9月18日
    047
  • flask中使用redis做缓存

    1.介绍 缓存介绍 如果您的应用运行很慢,那就尝试引入一些缓存吧。好吧,至少这是提高表现最简单的方法。缓存的工作是什么呢?比如说您有一个需要一段时间才能完成的函数,但是这个函数的返…

    Python 2023年8月9日
    069
  • Linux 下模拟制作块设备并挂载

    Linux 下模拟制作块设备并挂载 作者:Grey 原文地址: 博客园:Linux 下模拟制作块设备并挂载 CSDN:Linux 下模拟制作块设备并挂载 环境 CentOS-7 下…

    Python 2023年10月18日
    049
  • Pycharm创建Flask项目

    一、首先安装Pycharm、Flask pip install flask 备注:pip命令安装flask时会同步安装jinja2和werkzeug 二、打开Pycharm的Fil…

    Python 2023年8月3日
    056
  • redis集群之分片集群的原理和常用代理环境部署

    上篇文章刚刚介绍完redis的主从复制集群,但主从复制集群主要是为了解决redis集群的单点故障问题,通过整合哨兵能实现集群的高可用;但是却无法解决数据容量以及单节点的压力问题,所…

    Python 2023年10月13日
    079
  • python-函数-统计函数

    #(1)amax(),amin() 作用:计算数组中的元素沿指定轴的最大值,最小值 import numpy as np x = np.random.randint(1,11,9)…

    Python 2023年10月31日
    020
  • Pandas学习笔记

    目录 一、groupby相关操作 * 1.1 groupby agg 条件 频率统计 apply相关操作 plot相关操作 * 1. 双轴图表 一、groupby相关操作 当 li…

    Python 2023年8月19日
    045
  • pandas入门-层次化索引

    本文是对pandas的层次化索引的一个回顾性总结。 层次化索引(hierarchical indexing)它使你能在一个轴上拥有多个(两个以上)索引级别。抽象点说,它使你能以低维…

    Python 2023年8月22日
    051
  • 接口自动化测试入门 python+pytest+requests+pymysql+xlrd+allure

    1、首先搭建好框架,按照用途,采用分层的方法,把这个框架分为case,unils,conf,data,report层。注:(1)case中的方法名和模块名都应该以test_数字_名…

    Python 2023年9月12日
    036
  • python数据分析和数据挖掘之pandas模块

    一、pandas模块 pandas(Python Data Analysis Library)是基于numpy的数据分析模块,提供了大量标准数据模型和高效操作大型数据集所需要的工具…

    Python 2023年8月19日
    066
  • Python 的Tkinter包系列之二:菜单

    Python 的 Tkinter 包系列之二:菜单 先了解一下菜单 打开Windows 系统中”记事本”的界面,可以直观看到菜单: 在图形用户界面程序中, …

    Python 2023年8月2日
    062
  • 阿里云部署flask

    项目场景: flask服务部署到云服务器上,方便外网进行请求服务 问题描述 直接将flask工程进行打包发送到CentOS上可能导致版本不匹配问题,或者是自己的写的模块无法使用 原…

    Python 2023年8月10日
    046
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球