【问题标题】:Segmentation faults using f2py使用 f2py 的分段错误
【发布时间】:2016-02-10 17:46:46
【问题描述】:

这是对我在这里提出的问题的跟进... How do I allocate input arrays with f2py?

我已针对 cme​​ts 重新编写了该问题。最初的问题不清楚且太冗长。请参阅下面的评论 1。

我正在尝试使用 f2py 包装各种 fortran 子例程/函数,以读取用 fortran 77 编写的各种原子物理代码的数据输出。我在 Ubuntu 14.04 上使用 Anaconda python 发行版(python 3.4 64 位)( 64 位)与 gnu 编译器套件(gcc、gfortran 等)

我在尝试在 python 中预分配数组时遇到问题。我最初的问题是关于分配一个字符数组。原来我的形状不对。我已经解决了这个问题(我认为),现在正在处理分段错误。我已经使用 --debug-capi 标志编译了带有 f2py 的 fortran 子例程,以启用详细的错误报告。

这是我在运行 python 脚本时得到的终端输出的相关部分。

debug-capi:Python C/API function adf04_2py.xxdata_04(iunit,titled,iz,iz0,iz1,bwno,npl,bwnoa,lbseta,prtwta,cprta,il,qdorb,lqdorb,qdn,iorb,ia,cstrga,isa,ila,xja,wa,cpla,npla,ipla,zpla,nv,scef,itran,maxlev,tcode,i1a,i2a,aval,scom,beth,iadftyp,lprn,lcpl,lorb,lbeth,letyp,lptyp,lrtyp,lhtyp,lityp,lstyp,lltyp,itieactn,ltied,ndlev=len(ia),ndtrn=shape(tcode,0),ndmet=len(bwnoa),ndqdn=len(qdn),nvmax=len(scef))
debug-capi:int lltyp=:input,required,scalar
debug-capi:lltyp=0

        ####### omitted ##########

debug-capi:int ndmet=len(bwnoa):input,optional,scalar
debug-capi:ndmet=1
debug-capi:Checking `len(bwnoa)>=ndmet'
debug-capi:int ndqdn=len(qdn):input,optional,scalar
debug-capi:ndqdn=1
debug-capi:Checking `len(qdn)>=ndqdn'
debug-capi:int ndlev=len(ia):input,optional,scalar
debug-capi:ndlev=1
debug-capi:Checking `len(ia)>=ndlev'
debug-capi:int lqdorb=:input,required,array,dims((ndqdn*(ndqdn+1))/2|(ndqdn*(ndqdn+1))/2)
debug-capi:string cprta=:input,required,array,string array,dims(ndmet|ndmet,9|9)
debug-capi:double prtwta=:input,required,array,dims(ndmet|ndmet)
debug-capi:double beth=:input,required,array,dims(ndtrn|ndtrn)
debug-capi:string cstrga=:input,required,array,string array,dims(ndlev|ndlev,(*)|(*))
debug-capi:double zpla=:input,required,array,dims(ndmet|ndmet,ndlev|ndlev)
debug-capi:int ltied=:input,required,array,dims(ndlev|ndlev)
debug-capi:int npla=:input,required,array,dims(ndlev|ndlev)
debug-capi:int i2a=:input,required,array,dims(ndtrn|ndtrn)
debug-capi:int lbseta=:input,required,array,dims(ndmet|ndmet)
debug-capi:int i1a=:input,required,array,dims(ndtrn|ndtrn)
debug-capi:int ila=:input,required,array,dims(ndlev|ndlev)
debug-capi:double scom=:input,required,array,dims(nvmax|nvmax,ndtrn|ndtrn)
debug-capi:double qdorb=:input,required,array,dims((ndqdn*(ndqdn+1))/2|(ndqdn*(ndqdn+1))/2)
debug-capi:string cpla=:input,required,array,string array,dims(ndlev|ndlev,1|1)
debug-capi:int isa=:input,required,array,dims(ndlev|ndlev)
debug-capi:double wa=:input,required,array,dims(ndlev|ndlev)
debug-capi:int ipla=:input,required,array,dims(ndmet|ndmet,ndlev|ndlev)
debug-capi:double xja=:input,required,array,dims(ndlev|ndlev)
debug-capi:Fortran subroutine `xxdata_04(&iunit,&ndlev,&ndtrn,&ndmet,&ndqdn,&nvmax,titled,&iz,&iz0,&iz1,&bwno,&npl,bwnoa,lbseta,prtwta,cprta,&il,qdorb,lqdorb,qdn,&iorb,ia,cstrga,isa,ila,xja,wa,cpla,npla,ipla,zpla,&nv,scef,&itran,&maxlev,tcode,i1a,i2a,aval,scom,beth,&iadftyp,&lprn,&lcpl,&lorb,&lbeth,&letyp,&lptyp,&lrtyp,&lhtyp,&lityp,&lstyp,&lltyp,&itieactn,ltied,slen(titled),flen(cstrga))'
Segmentation fault (core dumped)

我的第一个问题是这个。是否可以从调试输出中准确判断出段错误?我不明白怎么做。

作为第二个问题,如果您查看调试输出的开头,您会看到一些看起来像函数调用的东西,我认为这是 python 从共享对象调用函数。在调试输出结束时,您会看到几乎相同的内容,但被标记为“fortran 子例程”。 fortran 子例程中的变量与 python 函数的顺序不同。共享对象是由 f2py 从原始 fortran 代码自动创建的。有人知道为什么这些变量的顺序不同吗?

提前致谢

【问题讨论】:

  • 请提供具有可重现行为的最小代码!我们不是来阅读你所有的长代码的。带有单个子程序的示例是最好的。
  • 不知道为什么应该投反对票?如果您阅读了我的原始帖子(链接在这个帖子中),您就会知道在这种情况下没有最小代码之类的东西。原始的 fortran 代码很长,我的 python 脚本可在原始发布的问题中找到。无论如何,这主要是关于如何解释我提供的 f2py 的调试输出的问题。我只是想避免我在这里经常看到的不可避免的“请发布整个输出”cmets。很抱歉浪费了您的时间,但您总是可以停止阅读。
  • 我没有投反对票。投反对票不是我的本性!即使我发现您的评论更具判断力,而只是猜测我,评论者也是反对者,我仍然不会反对。那是因为您的问题尽管难以理解,但似乎非常合理。我通常评论让 OP 提供更多细节或改进他们的问题。这里就是这种情况。只是为了向你保证,我不是 f2py 专家,所以即使有更清晰的问题,我也肯定没有知识可以回答。
  • 很公平。不试图通过判断。事后看来,我的问题很长而且不是很清楚。我已经相应地对其进行了编辑。但是,在这种情况下,发布代码的最小版本是不可能的。感谢您的回复。

标签: python c segmentation-fault fortran f2py


【解决方案1】:

不确定我是否应该像这样回答我自己的问题。如果这违反协议,那么我请求堆栈交换权力的宽恕。

所有信息(到目前为止)都包含在调试输出中。在将“scef”变量分配为适当大小/形状/类型的 numpy 数组后,段错误消失了。

我仍然遇到更多错误,但到目前为止,使用--debug-capi 浏览终端输出并仔细调整任何不正确的形状/大小/类型似乎正在修复它们。

如果其他人遇到这些问题,我希望这会有所帮助。

【讨论】:

  • “不确定我是否应该像这样回答我自己的问题”——如果你问了一个关于特定问题的问题,然后自己找到了解决该问题的方法,你甚至 鼓励回答你自己的问题!这就是为什么您甚至可以接受自己的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 2015-11-16
相关资源
最近更新 更多