在C#应用程序中嵌入IronPython - 在urllib上导入错误

时间:2010-02-08 19:13:27

标签: c# visual-studio-2010 ironpython visual-studio-2010-beta-2

我有一个包含内容的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'

(我从this stackoverflow querstion and answer得到了这个) 如果我省略了Python文件中的import urllib语句,一切正常。 (意思是它找到了re模块)
但是,只要我添加import urllibimport urllib2,我就会收到以下异常:

ImportException was unhandled
No module named urllib

所以它以某种方式无法找到urllib。我检查了IronPython lib文件夹,urllib和urllib 2肯定都存在。 当我在C#代码中导入urllib时,会抛出相同的异常。 (engine.ImportModule("urllib");

任何想法?
我想管理python代码中的导入,而不是C#代码 (所以我想避免这样的事情:engine.ImportModule("urllib");

修改 关于我实际将要使用它的一些额外信息(也许有人有另一种选择):
我将有一个主要的C#应用​​程序,python脚本将用作主应用程序的扩展或插件 我正在使用Python,因此我不需要编译任何插件。

3 个答案:

答案 0 :(得分:4)

我相信来自交互式控制台的'lib'在sys.path上实际上是在ipy.exe中完成的 - 当嵌入时你必须手动添加路径。引擎或运行时都有一个'SetSourcePaths'(或类似的)方法,允许你这样做。

答案 1 :(得分:1)

我面临同样的问题。按照“Tom E's”的建议,在对fuzzyman的回复的评论中,我可以成功地解决问题。问题似乎是它无法解析urllib.py的位置。我们需要设置它。

您可以查看以下link的问题和答案。

答案 2 :(得分:0)

您要导入的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