ошибка python и f2py - NameError: глобальное имя «inputUtil» не определено

Я скомпилировал код fortran в python, используя f2py (inputUtil.pyd). Я импортирую эту функцию в свой основной код Python и передаю этой функции два символа (locationAID и locationBID) из строки.

Вот сообщение об ошибке:

>>> Traceback (most recent call last):
  File "C:\FROM_OLD_HD\SynBio\Contact 5-23-12\contactsource_workingcopy\python\main.py", line 234, in batchExecute
    self.prepareProteins(tempList[1].replace("protA: ",""),tempList[2].replace("protAID: ",""),tempList[3].replace("protB: ",""),tempList[4].replace("protBID: ",""))
  File "C:\FROM_OLD_HD\SynBio\Contact 5-23-12\contactsource_workingcopy\python\main.py", line 668, in prepareProteins
    total = inputUtil(locationAID,locationBID)
NameError: global name 'inputUtil' is not defined

Вот части моего основного кода Python:

#import fortran modules
from contact import *
from inputUtil import *

....
def prepareProteins(self, locationA, locationAID, locationB, locationBID):
    self.output("Generating temporary protein files...")
    start_time = time.time()

    shutil.copyfile(locationA,"."+os.sep+"prota.pdb")
    shutil.copyfile(locationB,"."+os.sep+"protb.pdb")


    total = inputUtil(locationAID,locationBID)
...

Вот часть кода fortran, который я преобразовал в python с помощью f2py, который показывает передачу символа в эту функцию:

     subroutine inputUtil(chida,chidb)
c
       integer resnr,nbar,ljnbar,ljrsnr
       integer resns,nbars
       integer resnc,nbarc
       integer resnn,nbarn
c
       integer numa,numb,ns,n
c
       character*6 card,cards,cardc,cardn,ljcard
c
       character*1 alt,ljalt,chid,ljchid,code,ljcode
       character*1 alts,chids,codes
       character*1 altc,chidc,codec
       character*1 altn,chidn,coden
       character*1 chida,chidb
....

f2py отлично работал, так что я не думаю, что это проблема. Я только изучаю python - я старый программист Fortran (начал еще во времена перфокарт!). Так что, пожалуйста, ответьте чем-нибудь, что может понять старик.

Спасибо за любую помощь.

Панчпапа


person pete    schedule 10.04.2013    source источник


Ответы (1)


Я думаю, что вы путаете функции и модули здесь. Когда вы выполняете from inputUtil import *, а затем вызываете inputUtil, это то же самое, что и вызов функции inputUtil.inputUtil.

Я запустил f2py на предоставленном вами коде Fortran с одной дополнительной строкой: print*, "hello from fortran!". Мне также пришлось удалить строки комментариев C, предположительно, так как я использовал .f90. Вот команда, которую я использовал:

python "c:\python27\scripts\f2py.py" -c --fcompiler=gnu95 --compiler=mingw32 -lmsvcr71 -m inputUtil inputUtil.f90

Теперь я получаю модуль Python с именем inputUtil. Давайте попробуем это. Простой питон:

import inputUtil
inputUtil.inputUtil('A', 'B')

Отсюда я получаю:

AttributeError: 'module' object has no attribute 'inputUtil'

Так что же происходит? Смотрим на модуль:

print dir(inputUtil)

Это возвращает:

['__doc__', '__file__', '__name__', '__package__', '__version__', 'inpututil']

Судя по всему, заглавная буква U в inputUtil была преобразована в строчную. Давайте вызовем функцию с именем в нижнем регистре:

inputUtil.inpututil('A', 'B')

Теперь печатает:

hello from fortran!

Успех!

Похоже, это может быть проблемой/особенностью f2py для перевода имен функций в нижний регистр. Я никогда не сталкивался с этим, так как я обычно использую имена в нижнем регистре.

Для дальнейшего использования я бы также рекомендовал поместить Fortran в модуль и добавить операторы intent к вашим аргументам подпрограммы. Это упростит передачу переменных между модулями f2py и Python. Оберните модуль следующим образом:

module inpututils

contains

subroutine foo(a, b)
...code here...
end subroutine

end module

Затем вы импортируете все подпрограммы из модуля с use inpututils вверху подпрограммы в другом файле (до implicit none).

person bananafish    schedule 11.04.2013
comment
Без проблем! Пожалуйста, рассмотрите возможность принятия ответа (щелкните галочку рядом со стрелкой вниз), если он решил вашу проблему. - person bananafish; 16.04.2013