使用f2py进行分段错误

时间:2016-02-10 17:46:46

标签: python c segmentation-fault fortran f2py

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

我回答了这个问题以回应评论。最初的问题不清楚,而且过于冗长。见下面的评论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)

我的第一个问题是这个。是否有可能从调试输出中准确判断出segfaulted是什么?我不知道怎么做。

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

提前致谢

1 个答案:

答案 0 :(得分:1)

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

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

我仍然有进一步的错误,但到目前为止使用--debug-capi进行终端输出并仔细调整任何不正确的形状/大小/类型的东西似乎正在修复它们。

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