wx Python und f2py

Plattformunabhängige GUIs mit wxWidgets.
Antworten
sallemania
User
Beiträge: 3
Registriert: Dienstag 12. März 2013, 17:01

Hallo zusammen,

ich habe ein kleines problem im zusammenspiel zwischen wxPython und f2py. Habe nicht die leiseste Ahnung, woran es liegen könnte und bin deshalb auch nicht sicher, ob ich hier im wxPython Bereich richtig bin. Also, mal von vorn:

Ich konnte das Problem schon ziemlich weit runterbrechen. Ich habe eine fortran subroutine, die namelist input lesen soll und erstelle mittels f2py ein python modul.
Fortran Code:

Code: Alles auswählen

subroutine simple()
    implicit none
    real :: a,b
    NAMELIST /test/ a, b
    READ(*,test)
    WRITE(*,test)
end subroutine simple
Dann der python code zum testen:

Code: Alles auswählen

import wx
from test import simple

class app(wx.App):
    def OnInit(self):
        simple()
        self.frame = frame()
        self.frame.Show(True)       
        return True

class frame(wx.Frame):
    def __init__(self,parent=None):
        wx.Frame.__init__(self,parent,-1)
        
simple()
app1=app()
app1.MainLoop()
Ich rufe simple also 2 mal an verschiedenen Stellen auf und lese von der Kommandozeile. Das liefert dann folgendes.

Code: Alles auswählen

&test a=1.123 b=0.123/       
&TEST
 A=  1.12300003    ,
 B= 0.123000003    ,
 /
&test a=1.123 b=0.123/
&TEST
 A=  1.00000000    ,
 B=  0.00000000    ,
 /
Der namelist input macht aus allen eingegebenen Werten integer-Werte (genau genommen schneidet er einfach beim "." ab. Aus 5.33e-23 wird beispielsweise 5). Wenn die Mainloop läuft, dann funktioniert der Namelist input nicht mehr, die genaue stelle des einlesens ist egal. Hat jemand eine Idee oder Anregungen, wo ich Problemlösungen finden könnte?

Danke!
Zuletzt geändert von sallemania am Dienstag 12. März 2013, 17:54, insgesamt 2-mal geändert.
BlackJack

@sallemania: Ich kenne mich mit Fortran nicht aus, aber ich sehe nicht wo das *zweimal* aufgerufen wird? Von wo wird da überhaupt gelesen?
sallemania
User
Beiträge: 3
Registriert: Dienstag 12. März 2013, 17:01

Hallo Blackjack,

der zweite Aufruf ist mir wohl abhanden gekommen. Ist editiert... Es geht darum, dass ein Aufruf außerhalb von meiner laufenden "App" liegt und einer darin. Wo genau es passiert, scheint egal zu sein. Das geht auch schief, wenn es innerhalb eines beliebigen anderen widgets aufgerufen wird.

Es wird vom stdin (* in Fortran) gelesen. Ist aber egal, beim input über files (mit leicht geändertem Fortran code) ist das problem genau das gleiche.
BlackJack

@sallemania: Das ist ein, ähm sagen wir mal interessantes Problem. :shock:
sallemania
User
Beiträge: 3
Registriert: Dienstag 12. März 2013, 17:01

Der Meinung bin ich auch... Weiß echt nicht, wo ich da anfangen soll
e63
User
Beiträge: 2
Registriert: Samstag 7. September 2013, 19:39

Hallo sallemania,
Ist das Problem noch aktuell?
Ich mache sein 35 Jahren Fortran und bin die Jahre immer ohne NAMELIST ausgekommen, aber hier scheint es nötig zu sein, damit fortran mit python spricht.
In der aktuellen Sprachdefinition ist im Write ein NML= vorgeschrieben.
Vielleicht gibt es auch einen Bug in deinem F90 Compiler?

Der Silverfrost Compiler macht folgenden output

Code: Alles auswählen

Program test
CALL Simple()
end

subroutine simple()
    implicit none
    real :: a,b
    NAMELIST /test/ a, b
    print *,'testprint . simple called'
  
    a=12.2342 ; b=4234.124214
    WRITE(*,NML=test)

end subroutine simple
testprint . simple called
&TEST
A = 12.2342
B = 4234.12
/

Ist hier also ok. Wenn man mehr Kommastellen haben will, muss man halt REAL*8 nehmen,
Zuletzt geändert von e63 am Montag 9. September 2013, 15:07, insgesamt 1-mal geändert.
BlackJack

@e63: Wenn ich das richtig sehe hast Du zwei signifikante Unterschiede: Dein Code liest die Werte nicht von der Standardeingabe, was aber genau der Knackpunkt ist an dem das Problem auftritt, und es wird nicht klar ob Du das so hast laufen lassen, oder ob Du das mit/in einer `wx`-GUI ausgeführt hast, denn nur dann tritt das Problem von sallemania ja überhaupt auf. Ohne `wx` funktionierte es ja.

@sallemania: Ich vermute mal, dass `wx` etwas mit der Standardeingabe vom Prozess anstellt. Beziehungsweise wenn das unter Windows passieren sollte, da haben GUI-Anwendungen IIRC überhaupt keine Standardein- und ausgabe.
e63
User
Beiträge: 2
Registriert: Samstag 7. September 2013, 19:39

Hallo BlackJack,
ok, verstehe, dass es in einer speziellen Umgebung laufen muss.
Aber abgesehen davon, macht ein 'richtiger compiler' auch das hier

read *,a,b
WRITE(*,NML=test)

richtig.
Grüsse e63
Antworten