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 :

Problème avec une DLL Fortran


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 Problème avec une DLL Fortran
    Bonjour à tous,

    J'ai crée une DLL Fortran que je veux utiliser avec python .

    le module fortran est le suivant:
    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
    module module_calculate_stats
              use iso_fortran_env
              use iso_c_binding
              implicit none
     
              contains
                  subroutine calculate_sum(array, array_sum, n) bind(C)
                      integer(c_int), value :: n
                      real(kind=c_float), intent(in), dimension(n)::array
                      real(kind=c_float), intent(out)::array_sum
                      array_sum=sum(array)
                  end subroutine calculate_sum
     
                  subroutine calculate_mean(array, array_mean, n) bind(C)
                      integer(c_int), value :: n
                      real(kind=c_float), intent(in), dimension(n)::array
                      real(kind=c_float), intent(out)::array_mean
                      array_mean=sum(array)/n
                  end subroutine calculate_mean
     
         end module module_calculate_stats


    Le script python qui utilise la DLL est le suivant:
    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
    import ctypes as ct
    import numpy as np
    from numpy.ctypeslib import ndpointer
     
    fort_lib=ct.CDLL('./LibFortran.dll')
     
    fort_lib.calculate_sum.argtypes=[
                ndpointer(dtype=ct.c_float),
                ct.POINTER(ct.c_float),
                ct.c_int]
    fort_lib.calculate_sum.restype=None
     
     
    def my_mean(arr):
        arr = np.ascontiguousarray(arr, dtype=ct.c_float)
        mean = ct.c_float(0.0)
        n = arr.size
        fort_lib.calculate_sum(arr, mean, n)
        return mean.value
     
    print(my_mean([1,2,3,4,5]))
    En lançant le script j'ai le message d'erreur : AttributeError: function 'calculate_sum' not found. Avez-vous déjà rencontré le problème? une explication ou une solution ?

    Merci d'avance.

  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
    Salut,
    Citation Envoyé par lakhmesi Voir le message
    En lançant le script j'ai le message d'erreur : AttributeError: function 'calculate_sum' not found. Avez-vous déjà rencontré le problème? une explication ou une solution ?
    Ben ouais, c'est quand on oublie d'exporter les symboles de la DLL.
    Normalement, il y a des outils pour le confirmer.
    C'est un soucis avec la fabrication de la DLL (pour lequel python ne peut pas grand chose) et qui dépend du compilateur utilisé.

    - 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
    Salut wiztricks,

    Merci pour votre réponse .

    pour information, j'utilise le compilateur "IFORT Intel® Fortran Compiler Classic" pour créer ma DLL.

  4. #4
    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
    Salut,


    Ben ouais, c'est quand on oublie d'exporter les symboles de la DLL.
    Normalement, il y a des outils pour le confirmer.
    C'est un soucis avec la fabrication de la DLL (pour lequel python ne peut pas grand chose) et qui dépend du compilateur utilisé.

    - W

    la solution est simple : ajouter pour chaque subroutine: !DEC$ ATTRIBUTES DLLEXPORT :: Nom_Subroutine
    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
    module module_calculate_stats
              use iso_fortran_env
              use iso_c_binding
              implicit none
     
              contains
                  subroutine calculate_sum(array, array_sum, n) bind(C)
                       !DEC$ ATTRIBUTES DLLEXPORT ::  calculate_sum
                      integer(c_int), value :: n
                      real(kind=c_float), intent(in), dimension(n)::array
                      real(kind=c_float), intent(out)::array_sum
                      array_sum=sum(array)
                  end subroutine calculate_sum
     
                  subroutine calculate_mean(array, array_mean, n) bind(C)
                      !DEC$ ATTRIBUTES DLLEXPORT :: calculate__mean
                      integer(c_int), value :: n
                      real(kind=c_float), intent(in), dimension(n)::array
                      real(kind=c_float), intent(out)::array_mean
                      array_mean=sum(array)/n
                  end subroutine calculate_mean
     
         end module module_calculate_stats
    puis complier avec IFORT sur windows et créer la .dll:
    $ ifort -c main.f90
    $ ifort -dll -exe:main.dll main.obj

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

Discussions similaires

  1. [Exécution] Problème avec une DLL
    Par poukill dans le forum C++
    Réponses: 20
    Dernier message: 28/08/2008, 19h47
  2. Problème avec une DLL construite en Delphi
    Par steph_1 dans le forum Langage
    Réponses: 6
    Dernier message: 24/01/2008, 10h01
  3. Problème avec une Dll
    Par nnj dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/04/2007, 19h36
  4. Problème avec une DLL dans une boucle For
    Par BraDim dans le forum Langage
    Réponses: 5
    Dernier message: 20/09/2005, 12h22
  5. Problème avec une DLL
    Par SER dans le forum Langage
    Réponses: 7
    Dernier message: 23/08/2005, 13h58

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