IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaçage autre langage Python Discussion :

pssage d'un tableau de string entre Fortran DLL et python avec ctypes


Sujet :

Interfaçage autre langage Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur en MDF
    Inscrit en
    Mai 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur en MDF

    Informations forums :
    Inscription : Mai 2018
    Messages : 14
    Points : 14
    Points
    14
    Par défaut pssage d'un tableau de string entre Fortran DLL et python avec ctypes
    Bonjour à tous,

    je débute avec Ctypes et j'ai un problème de passage d'un tableau de string d'une ddl Fortran vers python.

    j'ai un fichier à lire avec la dll avec la structure suivante :

    aaaaa
    bbbbb
    ccccc
    4.0 5.0 6.5
    8.0 5.1 6.5
    3.0 5.2 6.5

    j'essaie de récupérer un tableau de string et un autre tableau de réel avec les codes suivants:


    mon code fortran
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    module read_file
               USE iso_fortran_env
               USE,INTRINSIC :: ISO_C_BINDING
              implicit none
     
     
          contains
     
              subroutine OPEN_FILE(FicWxx,path_cptr,lenpath_cptr)  BIND(C)
    			  !DEC$ ATTRIBUTES DLLEXPORT :: OPEN_FILE
                  integer (KIND=C_INT)         , intent(in) ,value     :: FicWxx
                  type(c_ptr), value :: path_cptr
                  integer(c_int), value :: lenpath_cptr
                  character(len=lenpath_cptr,kind=c_char), pointer :: PATH
    			  logical  :: lexist
     
                  call c_f_pointer(path_cptr, PATH)                                   			
     
     
                  inquire(file=trim(PATH),exist=lexist)
                  if(.not.lexist) then
                      stop
                  else
                      open(FicWxx,file=trim(PATH))  
                  end if
     
              end subroutine OPEN_FILE
     
    !--------------------------- read file   ----------------------------------------
     
     
    		  subroutine GET_Char_COL(FicWxx,numel,Py_Elem ) BIND(C) 
    			  !DEC$ ATTRIBUTES DLLEXPORT :: GET_Char_COL
     
    			  integer (KIND=C_INT)       ,value            , intent(in)    :: FicWxx
    			  integer (KIND=C_INT)                         , intent(in)    :: numel
    			  type(c_ptr)                , value             :: Py_Elem
                  character(KIND=C_char,len=16)      ,pointer   :: Elem  
     
    			  integer                                                        :: n
     
    			  call c_f_pointer(Py_Elem,Elem)
     
                  do n = 1, numel
                     read(FicWxx,*)Elem
                 end do 
    		  end subroutine GET_Char_COL
     
           !     
              subroutine GET_FLOAT(FicWxx,numel,param) BIND(C)
                  !DEC$ ATTRIBUTES DLLEXPORT :: GET_FLOAT
     
                  integer, parameter                                       :: Ncol=3
    			  integer (KIND=C_INT)   ,value              , intent(in)  :: FicWxx
                  integer (KIND=C_INT)   ,value              , intent(in)  :: numel
                  real  (KIND=C_FLOAT),dimension(numel,Ncol), intent(out)  :: param
     
                  integer                                                  :: n
     
                  do n = 1, numel
    	            read(FicWxx,*) param(n,:)
                  end do
     
              end subroutine GET_FLOAT
     
          end module read_file
    mon code python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    import ctypes
    import numpy as np
    from numpy.ctypeslib import ndpointer
    import os
     
     
    def Import_DLL():         
     
        PATH = os.path.dirname(os.path.realpath(__file__))
        Lib = ctypes.CDLL(os.path.join(PATH,"./DLL_read.dll"))
        return Lib
     
     
    def Decla_Arg():           
     
        Lib.open_file.argtypes = [ctypes.c_int, ctypes.c_char_p,ctypes.c_int]
        Lib.open_file.restype = None
     
        Lib.get_char_col.argtypes = [ctypes.c_int, ctypes.POINTER(ctypes.c_int), ndpointer(dtype=np.dtype('a16'))]
        Lib.get_char_col.restype = None
     
        Lib.get_float.argtypes = [ctypes.c_int, ctypes.c_int, ndpointer(dtype=ctypes.c_float)]
        Lib.get_float.restype = None
     
     
    def open_file(FicWxx,PATH):
        Lib.open_file(FicWxx,PATH.encode("utf-8"),len(PATH))
        return
     
    def get_char_col(FicWxx,nliais):
        z=[' ' for i in range(nliais)]
        #z=[]
        elem=np.asarray(z, dtype = np.dtype('a16'))
        print(elem)
        nliais = ctypes.c_int(nliais)
        Lib.get_char_col(FicWxx, nliais, elem)
        return elem
     
    def get_res_type(FicWxx, nliais):
     
        param=np.zeros(shape=(3 , nliais),dtype=ctypes.c_float)
        nliais = ctypes.c_int(nliais)
        Lib.get_float(FicWxx, nliais,param)
        return param
     
    # --------------  ___main___  --------------------------------
    if __name__ == "__main__":
     
        Lib=Import_DLL()
        Decla_Arg()
        nliais=3
        FicWxx = 15
        PATH =".......\\test.txt"
        open_file(FicWxx,PATH)
     
        elem = get_char_col(FicWxx, nliais)
        print("elem =", elem)
     
        param = get_res_type(FicWxx, nliais)
        print("param =", param)
    j'ai une erreur : in get_char_col
    Lib.get_char_col(FicWxx, nliais, elem) -> OSError: exception: stack overflow.

    PS: si j'ai un fichier sans les string , le code marche bien pour récupérer que le tableau de réel.

    Merci pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par lakhmesi Voir le message
    Merci pour votre aide.
    Pour imaginer pouvoir vous aider, il faut installer le compilateur fortran, compiler votre code, reproduire l'erreur,... et "tester" des idées de solutions avant de la partager... c'est beaucoup de travail pour un intérêt discutable.

    Depuis 15ans que je traîne dans le coin, j'ai jamais vu ce genre de question: j'imagine que ceux qui se lancent là dedans ont les bases pour s'en sortir et/ou savent chercher tout seul dans les documentations et Internet.

    Mais bon, une bouteille à la mer n'a jamais tué personne.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur en MDF
    Inscrit en
    Mai 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur en MDF

    Informations forums :
    Inscription : Mai 2018
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Pour imaginer pouvoir vous aider, il faut installer le compilateur fortran, compiler votre code, reproduire l'erreur,... et "tester" des idées de solutions avant de la partager... c'est beaucoup de travail pour un intérêt discutable.

    Depuis 15ans que je traîne dans le coin, j'ai jamais vu ce genre de question: j'imagine que ceux qui se lancent là dedans ont les bases pour s'en sortir et/ou savent chercher tout seul dans les documentations et Internet.

    Mais bon, une bouteille à la mer n'a jamais tué personne.

    - W
    cher monsieur ,

    j'ai crée ma dll et j'ai compilé mon code. c'est comme ça que je sais que ça ne marche pas et j'ai une erreur.

    j'ai déjà essayé de résoudre le problème sans sucés alors je l'ai posté ici.

    si ça vous dérange , alors quitter le forum et voila .

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par lakhmesi Voir le message
    si ça vous dérange , alors quitter le forum et voila .
    Un forum de discussion n'est pas une hotline pour vous servir... on peut raconter ce qu'on veut sur votre prose comme dire qu'il va falloir être patient avant de voir arriver une solution.

    Lorsque vous en aurez marre d'attendre, vous pourrez toujours acheter un support payant chez Intel.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur en MDF
    Inscrit en
    Mai 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur en MDF

    Informations forums :
    Inscription : Mai 2018
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Un forum de discussion n'est pas une hotline pour vous servir... on peut raconter ce qu'on veut sur votre prose comme dire qu'il va falloir être patient avant de voir arriver une solution.

    Lorsque vous en aurez marre d'attendre, vous pourrez toujours acheter un support payant chez Intel.

    - W
    je vous ai pas sollicité personnellement pour m'aider et me trouver une solution.

    je poste dans l'optique que quelqu'un d'autre a déja rencontré le problème avant moi et me donner des pistes à explorer .

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par lakhmesi Voir le message
    je poste dans l'optique que quelqu'un d'autre a déja rencontré le problème avant moi et me donner des pistes à explorer .
    Un peu de recherche sur Internet montre que des tas de gens ont eu ce genre de problème. On en parle ici par exemple.

    Si vous ignorez l'existence de f2py, difficile de faire croire que vous avez beaucoup cherché.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur en MDF
    Inscrit en
    Mai 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur en MDF

    Informations forums :
    Inscription : Mai 2018
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Un peu de recherche sur Internet montre que des tas de gens ont eu ce genre de problème. On en parle ici par exemple.

    Si vous ignorez l'existence de f2py, difficile de faire croire que vous avez beaucoup cherché.

    - W
    j'ai dèja fait un tour dans Stack Overflow avant de poster ici .

    je connais bien f2py et déjà utilisé mais dans mon cas je suis obligé d'utiliser Ctypes.

    Merci pour ton aide.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur en MDF
    Inscrit en
    Mai 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur en MDF

    Informations forums :
    Inscription : Mai 2018
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Bonjour à tous ,

    j'ai trouvé la solution au problème. Je la partage , ça pourrait servir un jour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    subroutine GET_Char_COL(FicWxx,numel,Py_Elem ) BIND(C) 
              !DEC$ ATTRIBUTES DLLEXPORT :: GET_Char_COL
     
              integer (KIND=C_INT)       ,value            , intent(in)    :: FicWxx
              integer (KIND=C_INT)                         , intent(in)    :: numel
              type(c_ptr)                , value               :: Py_Elem
              character(KIND=C_char,len=16) ,dimension(:)     ,pointer   :: Elem  
     
              integer                                                        :: n
     
              call c_f_pointer(Py_Elem,Elem,[numel])  ! numel is Rank-one array .The size must be equal to the rank of Py_Elem 
     
              do n = 1, numel
                 read(FicWxx,*)Elem(n)
             end do 
          end subroutine GET_Char_COL

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 3.X] Transfert de données entre C et python avec ctypes.
    Par Puzzlemaker dans le forum Interfaçage autre langage
    Réponses: 7
    Dernier message: 10/11/2020, 12h46
  2. Réponses: 15
    Dernier message: 21/12/2017, 11h49
  3. Réponses: 5
    Dernier message: 27/03/2008, 14h32
  4. [Collections] Conversion de Vector en tableau de String
    Par java_math dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 06/06/2004, 12h55
  5. [Collections] Tableau de String
    Par gexti dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 02/06/2004, 15h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo