Comment obtenir un python .pyd pour Windows à partir de c/c++ code source? (mise à jour: vive désormais en Python dans le cas qu'est ce que vous voulez)
Comment obtenir à partir de C/C++ code source de l'extension d'un fichier pyd pour windows (ou un autre élément que j'ai pu importer de Python)?
edit: La bibliothèque spécifique que je voulais utiliser (VIF) a été inclus dans OpenCV 2.4.3 donc, mon besoin de cette compétence est allé loin pour le moment. Dans le cas où vous êtes venu ici à la recherche d'VIVE, ici est une simple VIVE Python démo que j'ai posté.
J'ai le Vive code source (télécharger) que je voudrais construire et utiliser dans mon application en python. J'ai eu aussi loin que la génération d'un rapide.pyd fichier... mais c'était de 0 octets. Si il y a un mieux /autre manière de viser un rythme rapide.pyd fichier, alors bien sûr je suis ouvert à ça aussi.
edit: s'il vous Plaît ignorer toutes les tentatives dans ma question initiale ci-dessous et voir ma réponse qui a été rendue possible par obmarg détaillées de procédure pas à pas
Où vais-je tort?
- Distutils sans chemin de la bibliothèque: j'ai d'Abord essayé à la construction de la source, tout comme celle de distutils et suivantes setup.py (je viens de commencer l'apprentissage de distutils c'est donc un coup de feu dans l'obscurité). La structure de la progression RAPIDE du code source est en bas de cette question pour la référence.
from distutils.core import setup, Extension module1 = Extension('brisk', include_dirs = ['include', 'C:/opencv2.4/build/include', 'C:/brisk/thirdparty/agast/include'], #libraries = ['agast_static', 'brisk_static'], #library_dirs = ['win32/lib'], sources = ['src/brisk.cpp']) setup (name = 'BriskPackage', ext_modules = [module1])
Instantané qui m'a donné les lignes suivantes et un 0 octet rapide.pyd quelque part dans le dossier de création. Si près?
running build running build_ext
- Distutils avec le chemin de la bibliothèque: Scratch tentative. J'ai donc ajouté les deux de la bibliothèque de lignes qui sont commentées ci-dessus setup.py. Cela semble ok jusqu'à ce que j'ai obtenu cette erreur de couplage:
creating build\lib.win32-2.7 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\link.exe /DLL /nologo /INCREMENTAL:NO /LIBPATH:win32/lib /LIB PATH:C:\Python27_32bit\libs /LIBPATH:C:\Python27_32bit\PCbuild agast_static.lib brisk_static.lib /EXPORT:initbrisk build \temp.win32-2.7\Release\src/brisk.obj /OUT:build\lib.win32-2.7\brisk.pyd /IMPLIB:build\temp.win32-2.7\Release\src\brisk. lib /MANIFESTFILE:build\temp.win32-2.7\Release\src\brisk.pyd.manifest LINK : error LNK2001: unresolved external symbol initbrisk build\temp.win32-2.7\Release\src\brisk.lib : fatal error LNK1120: 1 unresolved externals error: command '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\link.exe"' failed with exit status 1120
- Incontrôlée agitant dans tous les sens: j'ai pensé que peut-être les bibliothèques devaient être construites, donc j'ai fait un cours intensif (beaucoup de plantage) avec cmake + mingw - mingw + vc++ express 2010, comme suit:
- cmake gui: source: c:/brisk, build: c:/brisk/build
- cmake gui: configurer pour Visual Studio 10
- cmake gui: utiliser les options par défaut et de générer (CMAKE_BACKWARDS_COMPATIBILITY, CMAKE_INSTALL_PREFIX, EXECUTABLE_OUTPUT_PATH, LIBRARY_OUTPUT_PATH)
- De VC++ Express 10: Changement de Libérer et de construire la solution générée par cmake et d'obtenir environ 20 pages de ce à quoi ressemblent à des non-critique des avertissements suivie par tous réussi. Remarque - pas de dll sont générés par cette. Il génère les bibliothèques suivantes de taille similaire à ceux inclus avec le téléchargement:
win32/lib/Release/ agast_static.lib brisk_static.lib
- Plus en agitant.
Pertinentes RAPIDE de la source de la structure du fichier de référence:
build/ (empty)
include/brisk/
brisk.h
hammingsse.hpp
src
brisk.cpp
demo.cpp
thirdparty/agast/
include/agast/
agast5_8.h ....
cvWrapper.h
src/
agast5_8.cc ...
CMakeLists.txt
win32/
bin/
brisk.mexw32
opencv_calib3d220.dll ...
lib/
agast_static.lib
brisk_static.lib
CMakeLists.txt
FindOpenCV.cmake
Makefile
Ne pas re-post: meta.stackexchange.com/questions/7046/...
La dernière on avait pas de réponses ou des commentaires, je vais donc le supprimer. Celui-ci est plus spécifique, alors j'espère que quelqu'un peut indiquer un endroit où je suis allé mal. Pour être clair pour quelqu'un d'autre qui voit cela, le premier texte de cette question a un lien pour le message original. Je n'étais pas d'essayer de se faufiler dans un autre.
D'accord, si. J'aurais juste totalement refait le premier au lieu de faire un nouveau. Merci pour la méta lien.
OriginalL'auteur KobeJohn | 2012-05-19
Vous devez vous connecter pour publier un commentaire.
Êtes-vous sûr que cette rapidité de la bibliothèque de même des exportations bindings python? Je ne vois aucune référence dans le code source, il n'a pas même l'air d'importer python fichiers d'en-tête. Ce serait certainement expliquer pourquoi vous n'avez pas eu beaucoup de succès jusqu'à présent - vous ne pouvez pas compiler du C++ code et attendre python à l'interface avec elle.
Je pense que votre deuxième distutils exemple est le plus proche de correct - c'est évidemment la compilation de choses et d'arriver à l'éditeur de liens scène, mais ensuite, vous rencontrez cette erreur. Cette erreur signifie simplement qu'il ne peut pas trouver une fonction nommée initbrisk qui je devine que ce serait le top niveau de la fonction init pour le module. De nouveau, cela suggère que vous essayez de compiler un module python de code qui n'est pas signifié pour elle.
Si vous souhaitez envelopper le code C++ dans un wrapper python vous-même, vous pourriez avoir un coup d'oeil à la documentation officielle sur l'écriture de c/c++ extensions. Vous pouvez également prendre un coup d'oeil dans boost::python, SIP ou shiboken qui tentent de mettre un peu (ou complètement) automatiser le processus de fabrication d'extensions python à partir d'un code C++.
EDIT: Puisque vous semblez avoir fait une quantité décente de l'effort de résoudre le problème vous-même et ont affiché une bonne question, j'ai décidé de donner une réponse plus détaillée sur la façon d'aller à ce sujet.
Rapide Tutoriel Sur l'Emballage des Bibliothèques C++ à l'Aide de boost::python
Personnellement, je n'ai jamais utilisé boost::python pour des trucs comme ça, donc je vais essayer et vous donner un bon résumé de la façon d'aller à ce sujet. Je vais supposer que vous êtes à l'aide de Visual C++ 2010. Je vais aussi supposer que vous avez une version 32 bits de python installé, je crois que le boost pro uniquement les bibliothèques fournissent 32 bits binaires.
L'installation de boost
D'abord, vous aurez besoin de récupérer une copie de la bibliothèque boost. La façon la plus simple de le faire est de télécharger un programme d'installation à partir le coup de pouce pro site web. Ces devez installer tous les fichiers d'en-tête et les fichiers binaires qui sont nécessaires pour utiliser le boost de la bibliothèque c++ sur windows. Prenez note de l'endroit où vous installer ces fichiers, que vous en aurez besoin plus tard -, il est peut être préférable de l'installer à un chemin sans un espace. Pour easyness je vais supposer que vous mettez ces fichiers dans C:\boost mais vous pouvez remplacer que par le chemin que vous avez effectivement utilisé.
Alternativement, vous pouvez suivre ces instructions à construire le coup de pouce de la source. Je ne suis pas sûr à 100%, mais c'est peut être le cas que vous besoin pour ce faire, afin d'obtenir une version de boost::python qui est compatible avec la version de python que vous avez installés.
La configuration d'un projet visual studio
Prochain, vous aurez envie de configuration d'un projet visual studio pour rapide.pyd. Si vous ouvrez visual studio, aller à New -> Projet puis de trouver l'option pour Win32 Projet. Configurer votre localisation, etc. et cliquez sur ok. Dans l'assistant qui s'affiche, sélectionnez une DLL type de projet, puis cochez le projet vide case.
Maintenant que vous avez créé votre projet, vous aurez besoin de mettre en place l'include & bibliothèque des chemins pour vous permettre d'utiliser python, boost::python et le dynamisme.fichier lib.
Dans Visual Studios de l'explorateur de solutions, cliquez droit sur votre projet et sélectionnez propriétés dans le menu qui s'affiche. Cela devrait ouvrir les pages de propriétés de votre projet. Accédez à l'éditeur de liens -> section Générale et de regarder pour la Bibliothèque Supplémentaire Répertoires de l'article. Vous aurez besoin de le remplir avec les chemins d'accès à la
.lib
fichiers pour boost, python et votrebrisk_static.lib
. Généralement, ceux-ci peuvent être trouvés danslib
(oulibs
) les sous-répertoires departout où vous avez installé les bibliothèques. Les chemins sont séparés par des points-virgules. J'ai joint une capture d'écran de mon paramètres ci-dessous:
Ensuite, vous aurez besoin pour obtenir visual studio pour le lien vers le .fichiers lib. Ces sections peuvent être trouvés dans le champ Dépendances Supplémentaires de l'éditeur de liens -> section d'Entrée de la propriété. C'est encore un point-virgule liste délimitée par des virgules. Vous avez besoin d'ajouter dans les bibliothèques python (dans mon cas c'est
python27.lib
mais cela va varier en fonction de la version) etbrisk_static.lib
. Ces n'avez pas besoin de tout le chemin que vous avez ajouté que dans la phase précédente. Encore une fois, voici une capture d'écran:Vous peut aussi besoin d'ajouter la boost_python fichier de bibliothèque mais je pense boost utilise certains fichier d'en-tête de la magie pour vous épargner la peine. Si je suis incorrect alors jetez un oeil à augmenter le chemin de la bibliothèque, un fichier nommé similaire à
boost_python-vc100-mt.lib
et d'ajouter que dans.Enfin, vous aurez besoin pour l'installation de l'inclure des chemins d'accès pour permettre à votre projet pour inclure le C++ fichiers d'en-tête. Pour obtenir les paramètres nécessaires apparaissent dans les propriétés du projet, vous aurez besoin d'ajouter une .rpc fichier à votre projet. Cliquez-droit sur le dossier des fichiers source dans votre explorateur de solutions, puis allez à ajouter un nouvel élément. Sélectionnez un Fichier C++ (.rpc) et le nom qu'il main.cpp (ou ce que vous voulez).
Ensuite, retournez à vos propriétés du projet et de passer à C/C++ -> Général. Sous le répertoire des bibliothèques, vous devez ajouter les chemins d'inclusion pour rapide, python et boost. De nouveau, les points-virgules pour les séparateurs, et encore ici une capture d'écran:
Je soupçonne que vous pourriez avoir besoin de mettre à jour ces paramètres pour inclure la opencv2 & agast les bibliothèques en tant que bien, mais je vais laisser ça comme une tâche pour vous à la figure -, il devrait être le même processus.
Emballage existants des classes c++ avec boost::python.
Maintenant vient le légèrement plus compliqué de bits a en fait écrit en C++ pour envelopper votre vive bibliothèque boost python. Vous pouvez trouver un tutoriel pour cette ici mais je vais essayer de visiter un peu.
Ce sera de prendre place dans le
main.cpp
fichier que vous avez créé plus tôt. Tout d'abord, ajoutez le comprennent des instructions vous aurez besoin d'au haut du fichier:Ensuite, vous aurez besoin de déclarer votre module python. Je suis en supposant que vous voudriez que cela soit appelé rapide, de sorte que vous faire quelque chose comme ceci:
Cela devrait dire boost::python pour créer un module python nommé
brisk
.Lendemain, c'est juste une affaire de passer par toutes les classes & les structures que vous souhaitez envelopper et de la déclaration de stimuler les classes python avec eux. Le declerations des classes doivent être contenus dans le vif.h. Vous ne devriez envelopper le public et les membres d'une classe, et non protégées ou privées des membres. Comme un exemple rapide, j'ai fait un couple de leurs structures ici:
Ici, j'ai enveloppé le cv::BriskPatternPoint et de la structure du cv::BriskScaleSpace classe. Quelques explications:
class_< cv::BriskPatternPoint >( "BriskPatternPoint" )
dit boost::python pour déclarer une classe, à l'aide de lacv::BriskPatternPoint
classe C++, et l'exposer commeBriskPatternPoint
en python..def_readwrite("y", &cv::BriskPatternPoint::y)
ajoute un lisible & accessible en écriture à la propriétéBriskPatternPoint
classe. La propriété est nommé y, et correspond à laBriskPatternPoint::y
c++ champ.class< cv::BriskScaleSpace >( "BriskScaleSpace", init< uint8_t >() )
déclare une autre classe, cette foisBriskScaleSpace
, mais fournit également un constructeur qui accepte un u_int8_t (un octet non signé - qui devrait juste faire correspondre à un nombre entier en python, mais je préfère être prudent pour ne pas passer dans l'un de plus de 255 octets - je ne sais pas ce qui se passerait dans cette situation)Suivantes
.def
ligne déclare une fonction boost::python doit (je pense) être en mesure de déterminer les types d'argument de fonctions automatiquement, donc vous n'avez pas besoin de les fournir.Il est sans doute intéressant de noter que je n'ai pas réellement compilé un de ces exemples - ils pourraient bien ne pas fonctionner du tout.
De toute façon, pour faire ce travail entièrement en python il faut juste être un cas de faire les mêmes pour chaque structure, de classe, de la propriété & la fonction que vous souhaitez accessible à partir de python - ce qui est tout à fait une tâche fastidieuse!
Si vous voulez voir un autre exemple de cette action, je n'ai ici pour conclure cette classe
Bâtiment & à l'aide de l'extension
Visual studio doit prendre soin de la construction de l'extension - puis à l'aide de c'est juste un cas de prendre le .DLL et de la renommer .pyd (vous pouvez obtenir VS de le faire pour vous, mais je vais laisser ça pour vous).
Puis il vous suffit de copier votre fichier python à quelque part sur votre python path (
site-packages
par exemple), à l'importation et à l'utiliser!De toute façon, j'ai passé une bonne heure, ou alors écris - donc, je vais arrêter ici. Toutes mes excuses si j'ai oublié quelque chose ou si quelque chose n'est pas clair, mais je fais surtout de la mémoire. J'espère que c'est de l'aide pour vous. Si vous besoin de quelque chose précisé s'il vous plaît laisser un commentaire ou poser une autre question.
Merci pour le conduit. J'ai beaucoup de lecture et pratique de le faire.
Pas de problème! Je viens d'écrire un massif modifier avec un peu plus de détails - j'espère que ça aide.
wow! Ok merci de me donner le temps de passer par là. Il ressemble exactement à ce dont j'ai besoin.
S'arrêter pour aujourd'hui, mais ce doit être le droit chemin (ou un droit) afin d'obtenir rapide de travail. Je vous remercie. Je suis arrivé à un point où enfin j'ai pu construire le projet (juste le motif de point dans votre exemple) et qu'elle a généré .exp, .pyd, .lib, .fichiers pdb. Cependant lorsque je l'ai importer le Vif.pyd-je obtenir "ImportError: DLL load failed: Le module spécifié est introuvable." Je vais regarder demain (dependency walker?.. je me suis également utilisé en dernier il y a longtemps). Avez-vous des rapide des suggestions?
OriginalL'auteur obmarg
Au cas où quelqu'un en a besoin, ce que j'ai jusqu'à présent. Fondamentalement, un BriskFeatureDetector qui peut être créé en Python et alors détecter appelé. La plupart de c'est juste de la confirmation/copier ce obmarg m'a montré, mais j'ai ajouté les détails que vous obtenez tout le chemin vers le pyd bibliothèque.
De détection de la méthode est encore incomplet pour moi, bien que depuis il ne permet pas de convertir les types de données. N'importe qui qui connait un bon moyen de l'améliorer, s'il vous plaît! Je l'ai fait savoir, par exemple, cette bibliothèque qui semble convertir un numpy ndarray d'un cv::Mat, mais je n'ai pas le temps de comprendre comment l'intégrer maintenant. Il existe également d'autres types de données qui doivent être converties.
Installer OpenCV 2.2
C:\opencv2.2
Installer Stimuler avec Boost Python
C:\boost\boost_1_47
Créer un Visual Studio 10 Projet:
brisk
Créer main.cpp dans les Fichiers Source
Le faire avant le projet, les paramètres de sorte que le C++ options disponibles dans les paramètres du projet
Paramètres du projet (clic droit sur le projet --> propriétés):
Inclut Les En-Têtes De
ajouter à autres Répertoires inclus (à adapter à votre propre python /rapide /etc. la base de chemins):
C:\opencv2.2\include;
C:\boost\boost_1_47;
C:\brisk\include;C:\brisk\thirdparty\agast\include;
C:\python27\include;
Bibliothèques (linker)
ajouter à Bibliothèque Supplémentaire Répertoires (à adapter à votre propre python /rapide /etc. la base de chemins):
C:\opencv2.2\lib;
C:\boost\boost_1_47\lib;
C:\brisk\win32\lib;
C:\python27\Libs;
Propriétés de Configuration --> Linker --> Entrée
ajouter à Dépendances Supplémentaires (à adapter à votre propre python /rapide /etc. la base de chemins):
opencv_imgproc220.lib;opencv_core220.lib;opencv_features2d220.lib;
agast_static.lib; brisk_static.lib;
python27.lib;
.pyd de sortie au lieu de .dll
Construire et de le renommer si nécessaire
Mettre à jour la variable d'environnement Path
Dans les paramètres de windows, assurez-vous que les éléments suivants sont inclus dans votre chemin (encore une fois, de s'adapter à vos chemins d'accès):
OriginalL'auteur KobeJohn