Ошибки сегментации с использованием f2py

Это продолжение вопроса, который я задал здесь ... Как мне выделить входные массивы с помощью f2py?

Я переработал вопрос в ответ на комментарии. Первоначальный вопрос был неясным и слишком длинным. См. Комментарий 1 ниже.

Я пытаюсь использовать f2py для обертывания различных подпрограмм / функций fortran для чтения вывода данных из различных кодов атомной физики, написанных на fortran 77. Я использую дистрибутив Python Anaconda (python 3.4 64 бит) на Ubuntu 14.04 (64 бит) с набором компиляторов GNU (gcc, gfortran и т. д.)

У меня возникают проблемы с предварительным распределением массивов в python. Мой первоначальный вопрос касался выделения массива символов. Оказывается, у меня была неправильная форма. Я исправил это (я думаю) и теперь имею дело с ошибкой сегментации. Я скомпилировал подпрограмму fortran с помощью f2py, используя флаг --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)

Мой первый вопрос такой. Можно ли по выводам отладки точно определить, что произошло с segfaс? Не понимаю как.

В качестве второго вопроса, если вы посмотрите на начало вывода отладки, вы увидите что-то похожее на вызов функции, который, как я считаю, является вызовом функции из общего объекта python. В конце отладочного вывода вы видите что-то почти идентичное, но помеченное как «подпрограмма fortran». Порядок переменных в подпрограмме fortran отличается от порядка в функции python. Общий объект был автоматически создан f2py из исходного кода fortran. Кто-нибудь знает, почему эти переменные находятся в другом порядке?

заранее спасибо


person ivanarnold    schedule 10.02.2016    source источник
comment
Пожалуйста, предоставьте минимальный код с воспроизводимым поведением! Мы здесь не для того, чтобы читать весь ваш длинный код. Лучше всего использовать одну подпрограмму.   -  person innoSPG    schedule 10.02.2016
comment
Не знаете, почему это заслужило голосование "против"? Если бы вы читали мой исходный пост (ссылка на который приведена в этом), вы бы знали, что в этом случае нет такой вещи, как минимальный код. Исходные коды fortran длинные, и мой скрипт python доступен в исходном опубликованном вопросе. В любом случае это в первую очередь вопрос о том, как интерпретировать вывод отладки от f2py, который я предоставил. Я просто пытался избежать неизбежного, пожалуйста, опубликуйте все выходные комментарии, которые я так часто вижу здесь. Извините за потраченное время, но вы всегда могли просто перестать читать.   -  person ivanarnold    schedule 10.02.2016
comment
Я не голосовал против. Не в моем характере голосовать против! Даже если я счел ваш комментарий более осуждающим, только предполагая, что я, комментатор, также проголосовал против, я все равно не собираюсь голосовать против. Это потому, что ваш вопрос, несмотря на то, что ему трудно следовать, кажется очень разумным. Я обычно комментирую, чтобы OP предоставил более подробную информацию или улучшил свои вопросы. Так было здесь. И, чтобы заверить вас, я не эксперт по f2py, поэтому даже на более четкий вопрос у меня точно не будет знаний, чтобы ответить.   -  person innoSPG    schedule 10.02.2016
comment
Справедливо. Не пытаюсь выносить суждение. Оглядываясь назад, мой вопрос был слишком длинным и не очень ясным. Я отредактировал это соответствующим образом. Однако в этом случае публикация минимальной версии кода на самом деле невозможна. Спасибо за ваш ответ.   -  person ivanarnold    schedule 10.02.2016


Ответы (1)


Не уверен, что я должен отвечать на свои вопросы вот так. Если это противоречит протоколу, я прошу прощения у тех, кто занимается обменом стеками.

Вся информация (пока) содержится в отладочных данных. После выделения переменной 'scef' как массива numpy правильного размера / формы / типа segfault исчез.

Я все еще получаю дополнительные ошибки, но пока просматриваю вывод терминала с использованием --debug-capi и тщательно изменяя размер всего, что не соответствует правильной форме / размеру / типу, похоже, исправляет их.

Если кто-то еще испытывает эти проблемы, я надеюсь, что это поможет.

person ivanarnold    schedule 10.02.2016
comment
Не уверен, что я должен отвечать на свои собственные вопросы подобным образом - если вы задали вопрос о конкретной проблеме, а затем сами нашли решение этой проблемы, вы даже воодушевлены < / b> чтобы ответить на свой вопрос! Вот почему вы даже можете принять свой собственный ответ! - person Programmer; 29.06.2021