使用f2py分割错误

2024-05-20 17:59:10 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我在这里问的一个问题的后续。。。 How do I allocate input arrays with f2py?

我根据评论修改了这个问题。原来的问题不清楚,而且太长了。见下文评论1。在

我试图用f2py包装各种fortran子程序/函数,以读取用fortran77编写的各种原子物理代码的数据输出。我在ubuntu14.04(64位)上使用Anaconda python发行版(python3.4 64位)和gnu编译器套件(gcc、gfortran等)

我在尝试在python中预分配数组时遇到问题。我最初的问题是分配一个字符数组。结果我弄错了形状。我已经修复了(我想),现在正在处理一个分段错误。我用f2py编译了fortran子例程,使用--debug-capi标志来启用详细的错误报告。在

下面是运行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代码自动创建的。有人知道为什么这些变量的顺序不同吗?在

提前谢谢


Tags: debuginputstringlenrequiredarrayintdouble
1条回答
网友
1楼 · 发布于 2024-05-20 17:59:10

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

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

我仍然得到更多的错误,但是到目前为止,使用 debug-capi检查终端输出,并仔细调整任何形状/大小/类型不正确的内容,似乎正在修复这些错误。在

如果有人遇到这些问题,我希望这能有所帮助。在

相关问题 更多 >