【问题标题】:Embedding IronPython in a C# application - import error on urllib在 C# 应用程序中嵌入 IronPython - urllib 上的导入错误
【发布时间】:2010-03-04 20:11:31
【问题描述】:

我有一个 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 * 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,因此我不需要编译任何插件。

【问题讨论】:

    标签: c# ironpython visual-studio-2010


    【解决方案1】:

    我相信交互式控制台中 sys.path 上的“Lib”实际上是在 ipy.exe 内完成的 - 嵌入时您必须手动添加路径。引擎或运行时都有一个“SetSourcePaths”(或类似)方法可以让您执行此操作。

    【讨论】:

    • 这似乎是问题所在。 sys.path 仅包含['.', 'C:\\DATA\\My Dropbox\\Projects\\C#\\IronPython reference\\DynamicTest\\Dy namicTest\\bin\\Debug\\Lib'](我的项目的位置)。我只需要找到正确的函数来添加正确的库路径。但这将是明天的事情。这也意味着该程序的用户将需要安装 IronPython?我希望当 C# 应用程序被编译并包含 IronPython DLL 文件时,程序能够运行。 (除非我也添加 IronPython 库?)
    • 我将 IronPython Lib 文件夹的内容复制到 sys.path 中的位置,现在我在 source.Execute(scope); 行上遇到语法异常(无效语法):/
    • 为了使用标准库模块,您需要可用的标准库(.py 文件)。这并不意味着您的用户需要安装 IronPython,但您需要提供应用程序使用的标准库部分(至少)。我不知道您为什么会收到语法错误-除了可能有无效的语法...异常中是否有更多信息,是否从 ipy.exe 运行相同的代码?
    • 请参阅:*.com/questions/1755572/…,了解如何获取/设置引擎搜索路径。
    • 从ipy.exe正常运行。当VS提示抛出异常时单击'Show Detail'时显示如下:i.imgur.com/a6mtb.png StackTrace的内容:ideone.com/oz2YyCvu SourceCode的内容是os.py的内容 所以从这里我只能假设问题必须与 os 模块连接。 (urllib 也导入 os,所以很自然会发生同样的问题。)我不知道问题是什么。语法错误似乎不太可能,因为它适用于 ipy.exe 我已经想感谢你的时间到现在为止:)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您从中导入的 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 中)
      • 有趣。从您的脚本(非交互式)中,当您评估 os.environ.get('PYTHONPATH') 时会得到什么?
      • import os 抛出与 urllib 相同的异常,所以我无法回答这个问题:)。交互方式(在 IronPython 和 CPython 中)它返回无库路径。
      最近更新 更多