Accueil » Python » Forums Python » Forum général Python » F2py failed with exit status 1

 • F2py failed with exit status 1

Document Actions
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.f


J'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.f


a fonctionnée, et la commande f2py a marchée également:

code:
f2py -c -m petit petit.f


J'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

subroutine foo(output,array,nx,ny,i1,i2,i3)

implicit none

integer,intent(in):: nx,ny,i1,i2,i3
real,dimension(nx,ny),intent(in):: array
real,intent(out):: output

write(*,*) 'Fortran: array(1,1)', array(1,1)
write(*,*) 'Fortran: array(1,2)', array(1,2)
write(*,*) 'Fortran: array(2,1)', array(2,1)
write(*,*) 'Fortran: array(2,2)', array(2,2)
write(*,*) 'Fortran: sum(array)', sum(array)

write(*,*) 'Fortran: i1',i1
write(*,*) 'Fortran: i2',i2
write(*,*) 'Fortran: i3',i3

output = sum(array) / (i1+i2+i3)

write(*,*) 'Fortran: output=',output

end subroutine foo


code:
#file: prog.py 

import numpy as np
import foo

i1,i2,i3 = 1,2,3

nx,ny = 5,6

array = np.arange(30.).reshape(nx,ny)

print 'Python: array[0,0]', array[0,0]
print 'Python: array[0,1]', array[0,1]
print 'Python: array[1,0]', array[1,0]
print 'Python: array[1,1]', array[1,1]
print 'Python: array.sum()', array.sum()
print 'Python: output', array.sum() / (i1+i2+i3)

#ok
output = foo.foo(array,i1,i2,i3,nx,ny)

#ok
output = foo.foo(array,i1,i2,i3)

#erreur
output = foo.foo(array,nx,ny,i1,i2,i3)

print 'Python: output', output


code:
f2py -m foo -c foo.f90
python prog.py


code:
Python: array[0,0] 0.0
Python: array[0,1] 1.0
Python: array[1,0] 6.0
Python: array[1,1] 7.0
Python: array.sum() 435.0
Python: output 72.5
 Fortran: array(1,1)   0.0000000    
 Fortran: array(1,2)  1.00000000    
 Fortran: array(2,1)   6.0000000    
 Fortran: array(2,2)   7.0000000    
 Fortran: sum(array)   435.00000    
 Fortran: i1           1
 Fortran: i2           2
 Fortran: i3           3
 Fortran: output=   72.500000    
 Fortran: array(1,1)   0.0000000    
 Fortran: array(1,2)  1.00000000    
 Fortran: array(2,1)   6.0000000    
 Fortran: array(2,2)   7.0000000    
 Fortran: sum(array)   435.00000    
 Fortran: i1           1
 Fortran: i2           2
 Fortran: i3           3
 Fortran: output=   72.500000    
foo:nx=2
Traceback (most recent call last):
  File "prog.py", line 24, in <module>
    output = foo.foo(array,nx,ny,i1,i2,i3)
foo.error: (shape(array,0)==nx) failed for 1st keyword nx



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
pdoc foo # Print Documenation


code:
This module 'foo' is auto-generated with f2py (version:2_5585).
Functions:
  output = foo(array,i1,i2,i3,nx=shape(array,0),ny=shape(array,1))


et ensuite, toujours dans ipython, tester un appel à la subroutine pour voir si tout est ok.

wink Re: F2py failed with exit status 1

Posté par Dreyliciouss le 20/07/2010 15:40
Oui cela marche très bien en mettant les dimensions du tableaux en derniers paramètres. Merci encore une fois.
J'aurais une autre petite question concernant f2py.
Lorsque je génère le .pyf que je peux modifier, ai-je besoin de repréciser dans le .pyf l'inclusion d'un fichier si je le fais dans mon programme fortran?
Car j'essai de le faire quand je veux construire le module avec la commande f2py -c fib2.pyf fib1.f par exemple, j'obtiens une erreur disant qu'il ne peut pas ouvrir le fichier inclus.
J'ai regardé mon fichier.pyf et aucune inclusion n'est déclaré. Penses-tu que cette erreur peut venir de ça?
Merci, ô guru du f2py!!

 • 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
subroutine foo

implicit none

include 'file.inc'

write(*,*) a

end subroutine foo


code:
!file: file.inc
real:: a

a = 1


code:
f2py -m foo -c foo.f90


dans ipython:

code:
import foo
foo.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(8) ::values
! 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=8) ICOL(COUNT)
! 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?