• F2py failed with exit status 1
Réponses:
23
Visites:
0
Up one level
Vous devez être un membre enregistré pour contribuer sur ce forum.
Inscrivez-vous maintenant
• F2py failed with exit status 1
Posté par
Dreyliciouss
le
19/07/2010 07:55
Bonjour à tous,
J'ai écris une routine en Fortran qui a pour but de récupérer les valeurs d'un tableau passé en paramètre et de les écrire dans un fichier binaire. Voici le code : C Subroutine simple pour récupérer les valeurs d'un tableau et C les écrire dans un fichier SUBROUTINE ecriproj(TAB,d,nAng,largCha) REAL :: largColTot REAL, INTENT(IN) :: d,nAng INTEGER, INTENT(IN) :: largCha INTEGER :: NENRG INTEGER :: nl REAL, DIMENSION(nAng*d,largCha) :: TAB REAL, DIMENSION(nAng*d,largCha) :: RECU CHARACTER*150 FICPRJ largeur = largCha FICPRJ= 'im.proj' NENRG = 0 nl = nAng*d C Récupération des données du tableau DO m = 1, nl DO n = 1, largeur RECU(m,n) = TAB(m,n) WRITE (*,*) RECU(m,n) END DO END DO largColTot=d C Création du fichier de sortie OPEN ( UNIT=1, FILE=FICPRJ , STATUS='NEW' , IOSTAT=IO ) DO J = 1 , largeur ! largeur de trou DO I = 1, nl NENRG = NENRG + 1 !on écrit les résultats des projections dans le fichier de sortie WRITE (IUREP,REC=NENRG2) TAB(I,J) END DO END DO CLOSE(1) RETURN END SUBROUTINE Je souhaite l'utiliser avec python en utilisant le module f2py. J'exécute la commande f2py -c -m petit petit.f et j'obtiens l'erreur suivante: error: Command "/usr/bin/g77 -g -Wall -fno-second-underscore -fPIC -O3 -funroll-loops -I/tmp/tmpw41Mch/src.linux-i686-2.6 -I/usr/lib/python2.5/site-packages/numpy/core/include -I/usr/local/include/python2.6 -c -c petit.f -o /tmp/tmpw41Mch/petit.o" failed with exit status 1 Auriez-vous une idée d'où cela peut-il provenir? Merci d'avance! |
• Re: F2py failed with exit status 1
Posté par
troisseize
le
19/07/2010 09:10
Bonjour,
Avant de créer un module Python avec f2py, il faut déjà que le code Fortran ne contiennent pas d'erreurs. As tu essayer de compiler simplement avec gfortran? code: gfortran -c petit.fJ'ai testé et obtenu quelques erreurs: - Il y a un mélange de commentaire au format Fortran77 (lignes commençant par un C) et format Fortran90 (lignes commencancant par un !). J'ai carrément enlever tous les commentaires pour le test. - Les tableaux TAB et RECU ont pour première dimension: nAng*d. nAng et d doivent donc être de type INTEGER et non REAL. - (ne pas oublier les 6 caractères espaces au début de chaque ligne pour le Fortran77, ça n'a pas du passer dans la mise en forme du post). Avec ça, la commande code: gfortran -c peti.fa fonctionnée, et la commande f2py a marchée également: code: f2py -c -m petit petit.fJ'espère que ça marchera chez toi aussi, f2py est vraiment génial. |
• Re: F2py failed with exit status 1
Posté par
Dreyliciouss
le
20/07/2010 10:50
Merci beaucoup pour ton aide!
Erreur résolue =) Vraiment merci! |
• Re: F2py failed with exit status 1
Posté par
Dreyliciouss
le
20/07/2010 10:53
Peut-êtrep pourra tu m'aider de nouveau car j'ai l'impression que tu t'y connais bien en interfaçage python/fortran. Mon problème est le suivant:
J'ai donc écrit une routine en fortran qui récupère en paramètre un tableau et ses dimensions entre autres. Je souhaite l'utiliser pour lire les valeurs de ce tableau écrit dans un programme python en utilisant la routine fortran dans mon fichier python. Cependant, en affichant les dimensions récupérées en paramètre dans la routine fortran, je m'aperçois que les valeurs sont modifiées. Je lui passe exactement un tableau et 5 entiers. Je récupère bien les valeurs du tableau mais les valeurs des entiers sont affectées aléatoirement parmis les 5 entiers. Pour être plus claire, je définie les paramètres dans mon fichier python a=5, b=32 et c=20. Une fois passées en paramètres en fortran, je me rend compte que a = 20, b=5 et c=32. Aurais-tu une idée pour transmettre correctement ces varariables à la routine? |
• Re: F2py failed with exit status 1
Posté par
troisseize
le
20/07/2010 12:15
Normalement il n'y a pas de problème à ce niveau.
Peut etre cela vient du fait que f2py permet d'appeler les subroutines Fortran de façon plus "Pythonic", lorsque le fichier source Fortran contient assez d'informations (intent(out),... ): - les variables "out" sont passées à gauche du signe égal, - les dimensions des tableaux sont des arguements optionels, et deviennent donc les derniers arguements. Par example: code: !file: foo.f90
code: #file: prog.py
code: f2py -m foo -c foo.f90
code: Python: array[0,0] 0.0
Est-ce que ton problème pourrait venir de là? |
• Re: F2py failed with exit status 1
Posté par
troisseize
le
20/07/2010 12:27
ps: avant d'écrire le "prog.py", je te conseille de tester dans l'interpréteur python (ou mieux, ipython):
code: ipython
dans ipython: code: import foo
code: This module 'foo' is auto-generated with f2py (version:2_5585).
et ensuite, toujours dans ipython, tester un appel à la subroutine pour voir si tout est ok. |
|
• Re: F2py failed with exit status 1
Posté par
troisseize
le
20/07/2010 16:12
De rien!
En fait je n'ai jamais eus besoin de modifier un fichier signature.pyf pour utiliser f2py. Je n'ai utilisé f2py que sur mes propres codes Fortran, je modifie donc mes fichiers sources Fortran directement au besoin. Par contre, quand on ne peut pas modifier les codes Fortran (library, etc...), on peut modifier les fichiers de signatures à la place. Je ne peux pas t'aider beaucoup concernant les fichiers de signatures... Est ce que tu as vraiment besoin de travailler sur les fichiers signatures? |
• Re: F2py failed with exit status 1
Posté par
Dreyliciouss
le
21/07/2010 09:39
Lorsque je compile mon programme fortran à l'aide de makefile, il n'y a pas de problèmes. Dès lors que j'utilise f2py, il est impossible pour le terminal d'ouvrir le fichier que j'inclus dans ma routine fortran à l'aide de l'instruction "Include".
Je suis pas obligée de travailler sur les fichiers signatures. C'était juste une idée. Tu n'as jamais utilisé f2py avec des fichiers à inclure dans ton programme fortran? C'est ce qui me pose problème. |
• Re: F2py failed with exit status 1
Posté par
Dreyliciouss
le
21/07/2010 11:47
J'ai trouvé l'option -I qui permet d'inclure un répertoire je pense que ça fonctionne.
|
• Re: F2py failed with exit status 1
Posté par
troisseize
le
21/07/2010 12:03
Je n'utilise pas "include", mais plutôt "use", plus puissant, qui sert à utiliser des modules Fortran90.
Je n'ai pas réussi à reproduire le problème entre f2py et "include", ci joint l'exemple testé qui ne pose pas problème. code: !file: foo.f90
code: !file: file.inc
code: f2py -m foo -c foo.f90
dans ipython: code: import foo
code: 1.00000000
Tu as sûrement quelques de plus compliqué? des fichiers dans des répertoires différents? autre chose? |
• Re: F2py failed with exit status 1
Posté par
troisseize
le
21/07/2010 12:07
ah tu as été plus rapide je n'avais pas vu le dernier message...
|
• Re: F2py failed with exit status 1
Posté par
Dreyliciouss
le
21/07/2010 12:14
f2py permet-il d'avoir plusieurs routines dans un même fichier fortran?
Mon fichier fortran en comporte deux et on dirait qu'il ne reconnait pas la dernière car lors de la création du fichier signature, il la renomme "unknown_subroutine". |
• Re: F2py failed with exit status 1
Posté par
troisseize
le
21/07/2010 13:12
On peut mettre plusieurs plusieurs subroutine/function dans un même fichiers, pas de problèmes pour f2py
|
• Re: F2py failed with exit status 1
Posté par
Dreyliciouss
le
21/07/2010 13:44
Aurais-tu une idée alors pourquoi il ne veut pas nommer les routines correctement?
|
• Re: F2py failed with exit status 1
Posté par
troisseize
le
21/07/2010 14:01
aucune idée... tu aurais un exemple simple à montrer?
|
• Re: F2py failed with exit status 1
Posté par
Dreyliciouss
le
21/07/2010 14:18
En fait, si je modifie le fichier signature, je peux facilement utiliser ensuite les deux routines. L'une fait appel à l'autre dans le programme fortran.
Cependant c'est assez lourd puisque f2py ne reconnait pas la dernière sous routine correctement, je dois la définir manuellement dans le fichier signature. Ca fonctionne mais vu que je dois le faire moi même cela signifie qu'il y a quand meme un soucis quelque part. Le code est le suivant: ! -*- f90 -*- !===================================================================== ! ECRIPROJ.F version 07/2010 ! Ecriture des projections dans un fichier binaire ! !========-=========-=========-=========-=========-=========-=========-= !========-=========-=========-=========-=========-=========-=========-= INTEGER FUNCTION ERREUR() !========-=========-=========-=========-=========-=========-=========-= ! message d'erreur de proto.c si aucun parametres C !========-=========-=========-=========-=========-=========-=========-= CALL SYSTEM('cat $HOME/help/proj3dpoint.help') ERREUR=0 RETURN END SUBROUTINE EXECUTABLE(a,b,c,d,e,f,g,h,i) INTEGER, INTENT(IN) :: e,i,d,b,h,g INTEGER, INTENT(IN) :: c,f INTEGER :: NENRG,TailleEnreg,largColTot CALL ECRIPROJ(a,b,c,d,e,f,g,h,i) RETURN END SUBROUTINE EXECUTABLE !======================================================================== SUBROUTINE ECRIPROJ(TAB,nPixCol,rayGir,nAng,larCha, & rayCach,prof,nbLig,nbCol) !======================================================================== ! Fichier contenant l'ensemble des parametres principaux ================ INCLUDE "param2D.f" ! TYPE (ParamFichier) :: ParamFic ! TYPE (collimateur) :: ParamCol ! type (geomacquis) :: ParamAcq CHARACTER*150 FICPRJ ! CHARACTER*150 IMAPRJ,FICCOL,FICACQ ! Integer*4,Dimension(10) :: ICOL,IACQ ! integer,dimension( ! character ::date,time,zone INTEGER, INTENT(IN) :: larCha,nbCol,nAng,nPixCol,nbLig,prof INTEGER, INTENT(IN) :: rayGir,rayCach INTEGER :: NENRG,TailleEnreg INTEGER :: r,q,m,n,I,J ! INTEGER :: occ INTEGER, DIMENSION(nbLig,nbCol) :: TAB INTEGER, DIMENSION(nbLig,nbCol) :: RECU print* ,'rayon giration = ', rayGir print* ,'rayon de cache = ',rayCach print* ,'Pixel du collimateur = ', nPixCol print* ,'profondeur = ', prof print* ,'nb angle = ',nAng !================== initialisation des données =============================== ! call date_and_time(date,time,zone,values) ! Call InitEntete(ParamFic,ParamCol,ParamAcq,ParamDec) TailleEnreg = 4*larCha !~~~~~~~~~~~~~~~~ Lecture des donnees entieres ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! WRITE(*,*)FICCOL ! OPEN ( UNIT=1, FILE=FICCOL , STATUS='OLD' , IOSTAT=IO ) ! IF(IO.NE.0) THEN ! WRITE(*,*)'ERREUR DANS LE FICHIER COLLIMATEUR' ! STOP ! ENDIF ! ! COUNT=1 ! DO WHILE (.TRUE.) ! READ (1,*,END= ! print *,ICOL(COUNT) ! COUNT=COUNT+1 ! END DO ! 8 CONTINUE ! CLOSE(1) ! INQUIRE(IOLENGTH=lgecol) ICOL ! ! ! WRITE(*,*)FICACQ ! OPEN ( UNIT=1, FILE=FICACQ , STATUS='OLD' , IOSTAT=IO ) ! IF(IO.NE.0) THEN ! WRITE(*,*)'ERREUR DANS LE FICHIER Acquisition' ! STOP ! ENDIF ! ! COUNT=1 ! DO WHILE (.TRUE.) ! READ (1,*,END=9) IACQ(COUNT) ! print *,IACQ(COUNT) ! COUNT=COUNT+1 ! END DO ! 9 CONTINUE ! CLOSE(1) ! INQUIRE(IOLENGTH=lgeacq) IACQ ! ============================================================================== ! Initialisation de l'entete collimateur ------------------------------------------------ ! ParamCol%NB_TYPE_TROU = ICOL(1) ! ParamCol%LAR1 = ICOL(2) ! ParamCol%LAR2 = ICOL(3) ! ParamCol%LAR3 = ICOL(4) ! ParamCol%PROF1 = ICOL(5) ! ParamCol%PROF2 = ICOL(6) ! ParamCol%PROF3 = ICOL(7) ! Initialisation de l'entete Geometrie acquisition-------------------------------------- ! ParamAcq%NB_ANG = IACQ(1) ! ParamAcq%INC_ANG = IACQ(2) ! ParamAcq%NSTART = IACQ(3) ! ParamAcq%IRAYORBI = IACQ(5) ! ParamAcq%IRayon = IACQ(4) ! ParamAcq%LARCHA = IACQ(6) ! ParamAcq%IPRCHA = IACQ(7) ! ============================================================================== ! ParamFic%Dimension = 3 ! ParamFic%IncPas(1) = 1 ! ParamFic%IncPas(2) = 1 ! ParamFic%IncPas(3) = ParamAcq%INC_ANG ! ParamFic%DebPas(1) = 1 ! ParamFic%DebPas(2) = 1 ! ParamFic%DebPas(3) = ParamAcq%NSTART ! ParamFic%Var(1) = 'X' ! ParamFic%Var(2) = 'Y' ! ParamFic%Var(3) = 'A' ! ParamFic%NbrPas(1) = ParamAcq%LARCHA ! ParamFic%NbrPas(2) = ParamCol%LAR1+ParamCol%LAR2+ParamCol%LAR3 ! ParamFic%NbrPas(3) = ParamAcq%NB_ANG ! ParamFic%NbrEnrEnt = 4 ! ParamFic%TailleEnreg = TailleEnreg ! ================== Construction du nom de fichier ============================ FICPRJ= 'image.proja' ! ================== Ouverture du fichier de sortie proja ======================= ! ~~~~~~~~~~~~~ Preparation de l'entete General ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! ParamAcq%SUJET = ParamFic%FicBin ! ParamFic%FormatEnreg = "R4" ! Format des donnees(I4,I8,R4,R8,C8,C16,..). ! ParamFic%DrapeauEnt = "ENT2004" ! nom de la version de l entete ! ParamFic%Drapeau = "cacao-proj" ! Mot Magique (cacao-proj,cacao-psd,...) ! ParamFic%Date = values ! ParamFic%NbrEnrEnt = 4 ! Nombre d'enregistrements de l'entete. ! ParamFic%NbrEnrTot = ParamFic%NbrEnrEnt + LargColTot ! -*ParamAcq%NB_ANG ! Nombre Total d'enregistrements. ! ParamFic%Dimension = 3 ! Nombre de dimensions. ! ParamFic%FicBin = FICPRJ OPEN(UNIT=5,FILE=FICPRJ,FORM='UNFORMATTED',RECL=TailleEnreg, & STATUS='NEW',ACCESS='DIRECT', IOSTAT=IO) NENRG=0 ! ~~~~~~~~~~~ Ecriture de l'entete dans le fichier de sortie proj ~~~~~~~~~~~~~~ ! print *,'************' ! CALL affichEntete(ParamFic,ParamCol,ParamAcq,ParamDec) ! ! WRITE (IUREP,REC = 1) ParamFic ! WRITE (IUREP,REC = 2) ParamCol ! WRITE (IUREP,REC = 3) ParamAcq ! WRITE (IUREP,REC = 4) ParamDec ! NENRG = 4 ! ~~~~~~~~~~ Récupération des projections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! ~~~~~~~~ Ecriture des projections dans le fichier de sortie proj ~~~~~~~~~~~~~ ! Initialisation du tableau RECU DO r= 1 , nbLig DO q = 1 , nbCol RECU(r,q) = 0 END DO END DO ! Récupération des données du tableau de appelProj DO m = 1, nbLig DO n = 1, nbCol RECU(m,n) = TAB(m,n) ! WRITE (*,*) RECU(m,n) END DO END DO print* ,'yep' DO J = 1 , nbLig DO I = 1, nbCol NENRG = NENRG + 1 !on écrit les résultats des projections dans le fichier de sortie WRITE (5, REC=NENRG) RECU(J,I) ! WRITE (*,*) RECU(J,I) END DO END DO ! ================== Fermeture du fichier de sortie proja ====================== CLOSE(IUREP) RETURN END SUBROUTINE ECRIPROJ Je suis désolée s'il y a beaucoup de lignes commentées. Lors que je créé le fichier signature il m'indique: "Reading fortran codes... Reading file 'EcriProj.f' (format:free) Line #30 in EcriProj.f:" SUBROUTINE ECRIPROJ(TAB,nPixCol,rayGir,nAng,larCha," analyzeline: No name/args pattern found for line. Line #38 in EcriProj.f:" INCLUDE "param2D.f"" readfortrancode: could not find include file 'param2D.f'. Ignoring. Post-processing... Block: EcriProj Block: erreur Block: executable Block: unknown_subroutine Post-processing (stage 2)... Saving signatures to file "./EcriProj.pyf" C'est donc la dernière routine qui est désignée comme "unkown_subroutine" |
• Re: F2py failed with exit status 1
Posté par
troisseize
le
21/07/2010 14:44
il y aurait peut etre une confusion entre format libre et format fixe (pour lequel le & doit etre sur la 5ième colonne).
Les indentations ne sont pas passées dans le code précédents donc ce n'est pas facile à dire... Mais les & sont au début de ligne, donc le format doit être fixe. Or f2py le détecte en format libre. Est ce chaque ligne commence par 6 blancs? Dans ce cas, ce serait la ligne: SUBROUTINE ECRIPROJ(TAB,nPixCol,rayGir,nAng,larCha, & rayCach,prof,nbLig,nbCol) qui poserait problème. Block: EcriProj => fichier EcriProj, ok Block: erreur => function erreur, ok Block: executable => subroutine executable, ok Block: unknown_subroutine => subroutine EcriProj, erreur |
• Re: F2py failed with exit status 1
Posté par
Dreyliciouss
le
21/07/2010 15:12
Chaque ligne commence bien par 6 blancs.
Oui ca doit être cette ligne là qui pose problème, néanmois je ne vois vraiment pourquoi... J'ai bien mis le "&" sur la 5ième colonne. |
• Re: F2py failed with exit status 1
Posté par
Dreyliciouss
le
23/07/2010 08:06
Sais-tu ce que signifie "undefined symbol: G77_date_and_time_0" lorsque j'utilise la fonction fortran date_and_time?
|






