Встраивание IronPython в приложение C # - ошибка импорта на urllib - PullRequest
4 голосов
/ 08 февраля 2010

У меня есть файл Python с содержимым:

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())

У меня также есть простой консольный проект на C # со следующим кодом:

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'

(я получил это от этого стекового запроса и ответа )
Если я пропущу оператор import urllib в файле Python, все будет работать нормально. (имеется в виду, что модуль re)
Но как только я добавляю import urllib или import urllib2, я получаю следующее исключение:

ImportException was unhandled
No module named urllib

Так что почему-то он не может найти urllib. Я проверил папку lib IronPython и определенно есть и urllib, и urllib 2. Такое же исключение выдается, когда я импортирую urllib в код C #. (engine.ImportModule("urllib");)

Есть идеи?
Я хотел бы управлять импортом в коде Python, а не в коде C #.
(Поэтому я бы хотел избежать таких вещей: engine.ImportModule("urllib");)

Edit: Некоторая дополнительная информация о том, для чего я собираюсь использовать это (возможно, у кого-то есть альтернатива):
У меня будет основное приложение на C #, а сценарии python будут использоваться в качестве расширений или плагинов для основного приложения.
Я использую Python, поэтому мне не нужно компилировать ни один из плагинов.

Ответы [ 3 ]

4 голосов
/ 09 февраля 2010

Я считаю, что 'Lib' на sys.path из интерактивной консоли фактически выполняется внутри ipy.exe - и при встраивании вам придется добавлять путь вручную. У движка или среды выполнения есть метод SetSourcePaths (или аналогичный), который позволит вам сделать это.

1 голос
/ 04 марта 2010

У меня такая же проблема. Следуя предложению «Тома Е» в комментариях к ответу нечеткого человека, я смог успешно решить эту проблему. Кажется, проблема в том, что он не может разрешить расположение файла urllib.py. Нам нужно установить его.

Вы можете проверить следующую ссылку для вопроса и ответа.

0 голосов
/ 08 февраля 2010

Версия CPython, из которой вы импортируете, должна соответствовать вашей версии IronPython. Используйте CPython v2.5 для IronPython 2.0 или v2.6 для IronPython 2.6.

Попробуйте это:

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