首页 > 解决方案 > f2py 正在导入子例程但不是模块

问题描述

我有一个 python 主程序,它从一个 fortran 程序中调用一个子例程,当我在没有“模块,隐式无”语句的情况下编写但不能使用它时,子例程运行良好

这是一个可重复的有效代码示例:

#data.csv 是我从中读取数据的地方

a,b,c
1,5,0.3
2,8,0.6
3,9,0.7
4,16,0.2
5,23,0.4

#来自蟒蛇

import pandas as pd 
import pymod
from numpy import *
data = pd.read_csv('data.csv')
column = data.columns
x_data = data[column[0]].values
y_data = data[column[1]].values
data_len = len(data)
a, b, sa, sb, r_squared, sigma  = pymod.simple_lin_fit(x_data, y_data, data_len)
print(a, b, sa ,sb, r_squared)

#pymod.f90

subroutine simple_lin_fit(x_data, y_data, N, a, b, sa, sb, r_squared, sigma)    
    implicit none
    real(kind = 8), dimension(N) , intent(in) :: x_data, y_data
    real(kind = 8), intent(out) :: a, b, sa, sb, r_squared, sigma
    real(kind = 8) :: sum_x, sum_xx, sum_xy, sum_y, sum_yy, SSE, SXX, SXY, SYY
    integer, intent(in) :: N
    
    sum_x = sum(x_data)
    sum_y = sum(y_data)
    sum_xx = sum(x_data**2) 
    sum_yy = sum(y_data**2)
    sum_xy = sum(x_data*y_data)
    
    SXY = sum_xy - sum_x*sum_y/N
    SXX = sum_xx - sum_x**2/N
    SYY = sum_yy - sum_y**2/N

    a = SXY/SXX
    b = (sum_y - a*sum_x)/N

    SSE = sum((y_data-a*x_data-b)**2)

    sigma = sqrt(SSE/(N-2))
    r_squared = 1 - SSE/SYY

    sa = sigma/sqrt(SXX)
    sb = sa*sqrt(sum_xx/N)
end subroutine simple_lin_fit

它工作得很好,当我编译它时,但当我放香味时它不起作用

module pymod
implicit none
contains
<subroutine>
end module

在里面,我需要把它写成一个fortran模块,因为我需要在fortran模块中添加一些其他模块

我遇到的错误是这个

Traceback (most recent call last):
  File "lin_fit.py", line 27, in <module>
    a, b, sa, sb, r_squared, sigma  = pymod.simple_lin_fit(x_data, y_data, N)
AttributeError: module 'pymod' has no attribute 'simple_lin_fit'

我用它编译它

f2py3 -m pymod -c pymod.f90 mv .so pymod.so

python3 pythonprogram.py

标签: pythonmodulefortransubroutinef2py

解决方案


推荐阅读