Impossible d'utiliser ctypes python pour charger la bibliothèque de l'action C

voix
0

Je suivre les instructions de cette page pour essayer d'appeler les fonctions C + .
Appel C / C ++ de Python?

Je vous écris un pylib.cpp

#include <iostream>

class Foo {
public:
    void bar() {
        std::cout << Hello << std::endl;
    }
};

extern C {
    Foo* Foo_new() { return new Foo(); }
    void Foo_bar(Foo* foo) { foo->bar(); }
}

et ensuite utiliser ces commandes sur la borne Win 10:

g++ -c -fPIC pylib.cpp -o pylib.o
g++ -shared -Wl,-soname,pylib.so -o pylib.so  pylib.o

Je reçois le message dans le terminal. Juste un avertissement. Le pylib.so encore maked par g ++.

pylib.cpp:1:0: warning: -fPIC ignored for target (all code is position independent)
 #include <iostream>
 ^

Je vous écris un pylib.py :

from ctypes import *

lib = cdll.LoadLibrary('pylib.so')
f = lib.Foo()
f.bar()

J'ai reçu le message d'erreur:

Traceback (most recent call last):
  File C:/Users/Jack/PycharmProjects/dip_hw1/pylib.py, line 3, in <module>
    lib = cdll.LoadLibrary('pylib.so')
  File C:\Python\lib\ctypes\__init__.py, line 426, in LoadLibrary
    return self._dlltype(name)
  File C:\Python\lib\ctypes\__init__.py, line 348, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 1114] 動態連結程式庫 (DLL) 初始化例行程序失敗。

OSError: [WinError 1114] 動態連結程式庫(DLL)初始化例行程序失敗.
Ce sens aime
OSError: [WinError 1114] bibliothèque de liens dynamiques (DLL) de routine d'initialisation a échoué

Mon environnement est

Python: Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)] on win32
C/C++ Compiler: TDM-GCC MinGW
OS: Win 10

Je peux charger bien la bibliothèque C. mais je continue obtenir erreur dll après avoir essayé beaucoup de différentes méthodes pour écrire le code C ++, ou pour faire la bibliothèque de partager avec manière différente.


Notez que: le nom des changements de bibliothèque cpp pylib2.dll. tout ce que je l' utilise .sopour .dllun nom de fichier dll, je reçois la même erreur.

Ceci est l'exemple de commande

C:\Users\Jack\PycharmProjects\dip_hw1>dir
 磁碟區 C 中的磁碟沒有標籤。
 磁碟區序號:  1AB4-8568

 C:\Users\Jack\PycharmProjects\dip_hw1 的目錄

2018/09/20  下午 03:26    <DIR>          .
2018/09/20  下午 03:26    <DIR>          ..
2018/09/20  下午 10:49    <DIR>          .idea
2018/09/18  上午 11:12    <DIR>          image
2015/06/28  下午 02:28            58,880 libatomic-1.dll
2015/06/28  下午 02:28            69,120 libatomic_64-1.dll
2013/09/01  上午 09:38           149,207 libcharset-1.dll
2015/06/28  上午 05:50           145,934 libgcc_s_dw2-1.dll
2015/06/28  下午 02:28           114,176 libgcc_s_seh_64-1.dll
2015/06/28  下午 02:28           120,832 libgcc_s_sjlj-1.dll
2015/06/28  下午 02:28           934,400 libiconv-2.dll
2014/04/27  上午 06:46           484,613 libintl-8.dll
2015/06/28  下午 02:28           359,936 libquadmath-0.dll
2015/06/28  下午 02:28           354,816 libquadmath_64-0.dll
2015/06/28  下午 02:28            13,824 libssp-0.dll
2015/06/28  下午 02:28            18,944 libssp_64-0.dll
2015/06/28  下午 02:28         1,374,208 libstdc++-6.dll
2015/06/28  下午 02:28         1,405,952 libstdc++_64-6.dll
2015/06/28  下午 02:28            11,264 libvtv-0.dll
2015/06/28  下午 02:28            15,872 libvtv_64-0.dll
2015/06/28  下午 02:28            11,264 libvtv_stubs-0.dll
2015/06/28  下午 02:28            15,872 libvtv_stubs_64-0.dll
2015/06/28  下午 02:28            60,928 libwinpthread-1.dll
2015/06/28  下午 02:28            64,512 libwinpthread_64-1.dll
2018/09/17  下午 04:55             1,918 main.cpython-36.pyc
2018/09/19  下午 12:14            10,587 main.py
2018/09/19  下午 08:11           113,157 pylib.dll
2018/09/20  下午 03:26               188 pylib.py
2018/09/19  下午 11:02         2,695,132 pylib2.dll
2018/09/19  下午 11:07         2,695,135 pylib2.so
2018/09/17  下午 04:56                26 run.bat
2018/09/19  下午 02:05               627 test.py
2018/09/17  下午 04:55    <DIR>          __pycache__
              28 個檔案      11,301,324 位元組
               5 個目錄  171,916,886,016 位元組可用

C:\Users\Jack\PycharmProjects\dip_hw1>python pylib.py
C:\Users\Jack\PycharmProjects\dip_hw1
C:\Users\Jack\PycharmProjects\dip_hw1
Traceback (most recent call last):
  File pylib.py, line 7, in <module>
    lib = cdll.LoadLibrary('pylib2.dll')
  File C:\Python\lib\ctypes\__init__.py, line 426, in LoadLibrary
    return self._dlltype(name)
  File C:\Python\lib\ctypes\__init__.py, line 348, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 1114] 動態連結程式庫 (DLL) 初始化例行程序失敗。

Et cela est le nouveau pylib.py Code

from ctypes import *
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
print(dir_path)
print(os.getcwd())

lib = cdll.LoadLibrary('pylib2.dll')
f = lib.Foo()
f.bar()
Créé 19/09/2018 à 13:24
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Je trouve la solution par moi-même. La solution est:

  1. En utilisant MinGW comipler ou le compilateur Microsoft C / C.
  2. En utilisant interpréteur Python 32 bits.
  3. Il ne faut pas copier dll du dossier bin du compilateur.

Tout d' abord, je le MinGW compilateur TDM-GCC comme compilateur C / C ++ avant. Ensuite , j'essaie un autre compilateur: MinGW . Je ne peux pas vous dire ce que les différents entre eux, je ne suis pas un gars pro. Mais ils produisent un message d'erreur différent lorsque j'utilise ctypespour charger les deux bibliothèque dll différent qui compile à la fois dans l' Python 3.6.6 64 bitinterprète. Ils ont tous échoué sur l' Python 3.6.6 64 bitinterprète.

J'essaie python 32 bits pour charger la bibliothèque dll. Il succès de charger la bibliothèque.
Le pylib.cpp code:

#include <iostream>
using namespace std;

class Foo {
public:
    void bar() {
        cout << "Hello" << endl;
    }
};

extern "C" {
    Foo* Foo_new() { return new Foo(); }
    void Foo_bar(Foo* foo) { foo->bar(); }
}

Compiler commande:

g++ -shared -o pylib.dll pylib.cpp

Le pylib.py code:

from ctypes import *

lib = cdll.LoadLibrary('pylib.dll')
f = lib.Foo_new()
lib.Foo_bar(f)

Le ouput:

Hello

Merci pour Pschill et d'autres proposent de nouvelles méthodes.

Créé 22/09/2018 à 06:50
source utilisateur

voix
0

Vous utilisez gcc de MinGW pour compiler et lier le code. Étant donné que le code utilise la bibliothèque standard C de ( #include <iostream>resp. std::cout), Vous devez rendre le libstdc++-6.dllfichier disponible qui est livré avec gcc. Copiez le fichier .dll dans le répertoire de travail, il devrait fonctionner.

Créé 19/09/2018 à 14:22
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more