4

Je dispose d'un fichier Python avec comme contenu:Intégration IronPython dans une application C# - erreur d'importation sur urllib

import re 
import urllib 

class A(object): 
    def __init__(self, x): 
     self.x = x 

    def getVal(self): 
     return self.x 

    def __str__(self): 
     return "instance of A with value '%s'" % (self.getVal()) 

J'ai aussi un projet simple console C# avec le code suivant:

engine = Python.CreateEngine(); 

ScriptSource source = engine.CreateScriptSourceFromFile("test.py"); 
ScriptScope scope = engine.CreateScope(); 
ObjectOperations op = engine.Operations; 

source.Execute(scope); // class object created 

object klaz = scope.GetVariable("A"); // get the class object 
object instance = op.Call(klaz, "blabla waarde"); // create the instance 
object method = op.GetMember(instance, "getVal"); // get a method 

string result = (string)op.Call(method); // call method and get result (9) 
Console.WriteLine("Result: " + result); //output: 'Result: blabla waarde' 

(Je l'ai obtenu de this stackoverflow querstion and answer)
Si je laisse de côté l'instruction d'importation urllib dans le fichier Python, tout fonctionne correctement. (Ce qui signifie qu'il trouve le module re)
Mais dès que je soit ajouter import urllib ou import urllib2-je obtenir l'exception suivante:

ImportException was unhandled 
No module named urllib 

donc en quelque sorte, il ne peut pas trouver qu'urllib. J'ai vérifié le dossier lib IronPython et urllib et urllib 2 sont définitivement là. La même exception est levée lorsque j'importe urllib dans le code C#. (engine.ImportModule("urllib");)

Des idées?
Je voudrais gérer les importations dans le code python et non dans le code C#.
(Je voudrais éviter des trucs comme ça: engine.ImportModule("urllib");)

Edit: quelques informations supplémentaires sur ce que je suis en fait va l'utiliser pour (peut-être quelqu'un a une alternative):
I aura une application C# principale et les scripts python seront utilisés comme extensions ou plugins pour l'application principale.
J'utilise Python pour ne pas avoir besoin de compiler les plugins.

Répondre

1

Je suis confronté au même problème. Suite à la suggestion de "Tom E" dans les commentaires à la réponse de fuzzyman je pourrais résoudre le problème avec succès. Le problème semble être qu'il n'est pas capable de résoudre l'emplacement de l'urllib.py. Nous devons le définir.

Vous pouvez vérifier les éléments suivants link pour la question et la réponse.

+0

Désolé pour l'acceptation (très tardive) de votre réponse, je n'avais pas regardé en arrière à la question. Cela fonctionne parfaitement. –

0

La version de CPython à partir de laquelle vous importez doit correspondre à votre version IronPython. Utilisez CPython v2.5 pour IronPython 2.0, ou v2.6 pour IronPython 2.6.

Essayez ceci:

import sys 
sys.path.append(r'\c:\python26\lib') # adjust to whatever version of CPython you have installed. 
import urllib 
+0

J'étais sous l'hypothèse qu'il essaierait d'importer à partir du dossier lib IronPython. Quoi qu'il en soit, les versions correspondent (2.6), j'ai ajouté le code et cela me donne une exception de syntaxe. (lors de l'exécution du code C# dans Visual Studio) Lorsque je l'exécute directement dans l'invite de commande, le script s'exécute normalement. (à la fois dans IronPython et CPython) –

+0

Intéressant. A partir de votre script (pas interactivement), qu'obtenez-vous en évaluant os.environ.get ('PYTHONPATH')? –

+0

'import os' jette la même exception que urllib donc je ne peux pas répondre à cette question :). Interactivement (à la fois dans IronPython et CPython) il retourne None Edit: Je pense que fuzzyman pourrait être sur la bonne voie, lors de l'impression 'sys.path' depuis le script je reçois seulement '['.', 'C: \\ DATA \\ Mes Dropbox \\ Projets \\ C# \\ IronPython référence \\ DynamicTest \\ Dy namicTest \\ bin \\ Debug \\ Lib '] 'Maintenant, je dois juste trouver la bonne fonction pour charger le bon chemin lib. –

4

Je crois que « Lib » être sur sys.path de la console interactive est réellement fait à l'intérieur ipy.exe - et lors de l'incorporation, vous devrez ajouter le chemin manuellement. Le moteur ou le moteur d'exécution possède une méthode 'SetSourcePaths' (ou similaire) qui vous permettra de le faire.

+0

Cela semble être le problème. sys.path contient uniquement '['.', 'C: \\ DATA \\ Mes projets Dropbox \\ C# \\ IronPython \\ DynamicTest \\ Dy namicTest \\ bin \\ Debug \\ Lib'] '(l'emplacement de mon projet). J'ai juste besoin de trouver la bonne fonction pour ajouter le bon chemin de bibliothèque. Mais ce sera pour demain. Cela signifie également que les utilisateurs de ce programme devront installer IronPython? J'espérais que lorsque l'application C# serait compilée et que les fichiers DLL IronPython seraient inclus, le programme pourrait fonctionner. (sauf si j'ajoute aussi les bibliothèques IronPython?) –

+0

J'ai copié le contenu du dossier IronPython Lib à l'emplacement dans sys.path et maintenant j'obtiens une exception de syntaxe (syntaxe invalide) sur la ligne 'source.Execute (scope): ':/ –

+1

Pour utiliser les modules de bibliothèque standard, vous aurez besoin de la bibliothèque standard (les fichiers .py) disponibles. Cela ne signifie pas que vos utilisateurs auront besoin d'IronPython, mais vous devrez envoyer les parties de la bibliothèque standard (au minimum) utilisées par votre application. Je ne sais pas pourquoi vous obtenez une erreur de syntaxe - autre que possiblement avoir une syntaxe invalide ... Y a-t-il plus d'informations dans l'exception, est-ce que le même code s'exécute depuis ipy.exe? – fuzzyman

Questions connexes