Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Python调用Fortran.pyd文件并返回0.0_Python_Fortran77 - Fatal编程技术网

从Python调用Fortran.pyd文件并返回0.0

从Python调用Fortran.pyd文件并返回0.0,python,fortran77,Python,Fortran77,我有一个非常基本的问题。我有一些旧的FORTRAN77代码,我在Windows中用f2py编写。当我在Python中调用它时,返回值是0.0,而不是正确的值 编译前,这里是我的正确的FORTRAN代码(用于测试) FUNCTION ttt (APPRAT, METRAT) REAL APPRAT, METRAT IF(APPRAT.LE.0.0)THEN ttt = METRAT * 0.89218 ELSE ttt = APPRAT ENDI

我有一个非常基本的问题。我有一些旧的FORTRAN77代码,我在Windows中用f2py编写。当我在Python中调用它时,返回值是0.0,而不是正确的值

编译前,这里是我的正确的FORTRAN代码(用于测试)

  FUNCTION ttt (APPRAT, METRAT)

  REAL APPRAT, METRAT      

  IF(APPRAT.LE.0.0)THEN
    ttt = METRAT * 0.89218
  ELSE
    ttt = APPRAT
  ENDIF
  RETURN
  END 
下面是python代码

import al4 #the name of compiled FORTRAN 77 code which is a .pyd file
ff=(al4.ttt(-1,10))
print(ff)

如果一切都正确,我应该得到8.9218作为返回值,但我总是得到0.0。有人能给我一些建议吗?提前谢谢

下面是我在f2py文档中拼凑的一些小东西:

 c This is file al4.f

      FUNCTION ttt (APPRAT, METRAT)
      IMPLICIT NONE
      REAL APPRAT, METRAT,ttt
 cf2py intent(in), APPRAT,METRAT
 cf2py intent(out) ttt      

      IF(APPRAT.LE.0.0)THEN
         ttt = METRAT * 0.89218
      ELSE
         ttt = APPRAT
      ENDIF
      RETURN
      END 
然后我用:
f2py-cal4.f-mal4
然后运行上面的python脚本(与al4.so在同一目录中——尽管扩展名“.so”可能会因系统而异),它就工作了。
cf2py
是特殊注释(fortran注释在第一列中有一个
c
),它告诉f2py如何处理参数。在这种情况下,您有2个输入和1个输出


编辑我应该练习我在评论中说的话…(在函数中添加了隐式NONE)

我对Fortran或Fortran Python接口一无所知,但这可能与-1和10是整数这一事实有关吗?还是因为您将赋值给
APPRAT
,而不是
ttt
?@EmilVikström感谢您的评论。我尝试将两个浮点值输入FORTRAN代码,但仍然得到0.0。但您是对的,FORTRAN确实返回了ttt而不是APPAT。谢谢你的帮助!我不知道这是否是一个问题,但对于上面的函数,ttt没有给出任何显式类型——因此fortran会将其视为一个实函数(因为它以t开头)。我认为f2py足够聪明,可以找出类型的歧义,但在处理fortran代码时,再小心也不为过…@mgilson,谢谢你的评论。那么,用FORTRAN编写此函数的标准方法是什么(定义函数并返回值)?很抱歉问这个基本问题,因为我对Python和FORTRAN都是新手……谢谢!如果Fortran支持类似“RETURN ttt”的东西,问题就不在这里,而不是Fortran。事实上,在Fortran程序中,您可以按预期的方式调用函数
result=ttt(v1,v2)
。问题在于f2py如何决定为函数创建包装器。。。在本例中,似乎我们需要明确地告诉f2py它应该如何处理参数。