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

4

我有一个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'

(我从这个stackoverflow问题和答案中得到了这个内容)
如果我在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个回答

4

我认为从交互式控制台中将“Lib”添加到sys.path实际上是在ipy.exe中完成的-当嵌入时,您将不得不手动添加路径。无论引擎还是运行时都有一个“SetSourcePaths”(或类似)方法,可以让您这样做。


这似乎是问题所在。sys.path 只包含 ['.', 'C:\\DATA\\My Dropbox\\Projects\\C#\\IronPython reference\\DynamicTest\\DynamicTest\\bin\\Debug\\Lib'](我的项目位置)。我只需要找到正确的函数来添加正确的库路径。但这将留待明天。这也意味着该程序的用户需要安装 IronPython 吗?我希望当 C# 应用程序被编译并包含了 IronPython DLL 文件时,程序能够运行。(除非我也添加了 IronPython 库?) - Jeroen Pelgrims
我将IronPython Lib文件夹的内容复制到了sys.path中的位置,现在我在source.Execute(scope);行上遇到了语法异常(无效语法):/ - Jeroen Pelgrims
1
为了使用标准库模块,您需要可用的标准库(.py文件)。这并不意味着您的用户需要安装IronPython,但您需要至少发布应用程序使用的标准库部分。我不知道为什么会出现语法错误 - 除非可能存在无效的语法... 异常中是否有更多信息,相同的代码是否从ipy.exe运行? - fuzzyman
3
请看这里:https://dev59.com/CkrSa4cB1Zd3GeqPV2Er#1756818,了解如何获取/设置引擎搜索路径。 - Tom E
它从ipy.exe正常运行。当VS指示抛出异常时,我点击“显示详细信息”后显示如下内容:http://i.imgur.com/a6mtb.png StackTrace的内容:http://ideone.com/oz2YyCvu。SourceCode的内容是os.py的内容。 因此,我只能假设问题必须与os模块有关。 (urllib也导入了os,因此自然会出现相同的问题。) 尽管如此,我不知道问题在哪里... 由于在ipy.exe上可以工作,语法错误似乎不太可能。 非常感谢您迄今为止的耐心陪伴! - Jeroen Pelgrims

1

我面临着同样的问题。在评论中遵循“Tom E”的建议,我成功地解决了这个问题。问题似乎是它无法解析urllib.py的位置。我们需要设置它。

你可以查看以下link来获取问题和答案。


0

你导入的CPython版本必须与你的IronPython版本匹配。对于IronPython 2.0,请使用CPython v2.5,对于IronPython 2.6,请使用v2.6。

试试这个:

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

我原本以为它会尝试从IronPython lib文件夹中导入。无论如何,版本匹配(2.6),我添加了代码,但它给了我一个语法异常。(在Visual Studio的C#代码中运行时)当我直接在命令提示符中运行它时,脚本正常执行。(在IronPython和CPython中都是如此) - Jeroen Pelgrims
有趣。从你的脚本(非交互式)中,当你评估os.environ.get('PYTHONPATH')时,你得到了什么? - Justin R.
import os 抛出与 urllib 相同的异常,所以我无法回答那个问题 :). 在交互式模式下(包括 IronPython 和 CPython),它返回 None。 编辑:我认为 fuzzyman 可能是正确的轨迹,当从脚本中打印 sys.path 时,我只得到 ['。', 'C:\\DATA\\My Dropbox\\Projects\\C#\\IronPython reference\\DynamicTest\\Dy namicTest\\bin\\Debug\\Lib']。现在我只需要找到正确的函数来加载正确的 lib 路径。 - Jeroen Pelgrims

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接