2010-11-06 17 views
2

Après l'exemple this, j'ai créé un petit fichier de bibliothèque hello.pyd, dont le contenu se trouve à la fin de cette question.
Importer une bibliothèque * .pyd dans l'interpréteur IronPython (ipy.exe)

Quand j'entre l'interpréteur python je reçois le texte suivant:

D:\test\build\lib.win32-2.6>C:\Python26\python.exe 
Python 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import hello 
>>> hello.say_hello("Greg") 
Hello Greg! 
>>> 

Mais essayer cela avec l'interprète de IronPython donne une erreur:

D:\test\build\lib.win32-2.6>"C:\Program Files (x86)\IronPython 2.7\ipy.exe" 
IronPython 2.7 Alpha 1 (2.7.0.1) on .NET 4.0.30319.1 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import hello 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named hello 
>>> 

Comment puis-je faire interprète ipy accepter cette C++ bibliothèque compilé ?


hellomodule.cpp

#include "C:\Python26\include\Python.h" 

static PyObject* say_hello(PyObject* self, PyObject* args) 
{ 
    const char* name; 

    if (!PyArg_ParseTuple(args, "s", &name)) 
     return NULL; 

    printf("Hello %s!\n", name); 

    Py_RETURN_NONE; 
} 

static PyMethodDef HelloMethods[] = 
{ 
    {"say_hello", say_hello, METH_VARARGS, "Greet somebody."}, 
    {NULL, NULL, 0, NULL} 
}; 

PyMODINIT_FUNC 

inithello(void) 
{ 
    (void) Py_InitModule("hello", HelloMethods); 
} 

setup.py

from distutils.core import setup, Extension 

module1 = Extension('hello', sources = ['hellomodule.cpp']) 

setup (name = 'PackageName', 
     version = '1.0', 
     description = 'This is a demo package', 
     ext_modules = [module1]) 

Compilé comme suit

python setup.py build -cmingw32 

Répondre

3

Vous pouvez essayer d'utiliser Ironclad, mais il n'a pas vu beaucoup de travail récemment.

0

La réponse est très probablement que votre bibliothèque .pyd n'est pas dans le chemin correct pour IronPython pour le ramasser. Puisque vous avez utilisé Python et non les outils d'installation d'IronPython, il a probablement été construit et configuré dans le PYTHONPATH plutôt que là où il doit être pour IronPython.

La solution est à un.) Changer votre chemin pour IronPython ou b.) La reconstruction dans le chemin de IronPython

+3

Non, le problème est qu'un .pyd est une extension C non géré, alors que IronPython est une application .NET gérée ; vous avez besoin d'une couche pour traduire entre les deux, un peu comme P/Invoke. –

+0

@Ignacio: merci, c'est probablement plus susceptible de l'être. Bien qu'il vaut la peine de noter qu'il devra être dans le bon chemin pour toujours travailler indépendamment ou quels outils il utilise. –