【问题标题】:Import embedded libs of IronPython导入 IronPython 的嵌入式库
【发布时间】:2012-12-14 12:09:13
【问题描述】:

我通过 NuGet 将 IronPython 标准库添加到我的 c#.net4 项目中,后来得到了一些参考(IronPython、IronPython.Modules、IronPython.SQLite、IronPython.Wpf、Microsoft.Dynamic、Microsoft.Scripting 等)和' Lib' 文件夹包含 python 模块。 现在我正在尝试在我的 file.py 中导入“urllib”模块,但收到 ImportException(没有名为 urllib 的模块)。 如何使用 urllib?我应该将 Lib 文件夹复制到项目输出目录还是做其他事情?

UPD:如果我将所需的模块复制到项目输出目录,那么程序可以在没有设置路径的情况下正常工作。 我可以使用 'urllib' 作为嵌入式资源还是在运行时导入它?

谢谢!

来源:

public static void Main(string[] args)
{
    var url = new Uri("www.microsoft.com");
    var r = PythonHelper.Get(url);
}

public static class PythonHelper
{
    public static string Get(Uri url)
    {
        var programPath = @"PySources\GetPage.py";
        var py = new Py(programPath);
        py.Scope.SetVariable("url", url.ToString());
        py.Source.Execute();
        var result = py.Scope.GetVariable<string>("result");
        return result;
    }

    private class Py
    {
        public ScriptScope Scope { get; private set; }
        public ScriptSource Source { get; private set; }

        public Py(string pyPath)
        {
            var pyEngine = Python.CreateEngine();
            Scope = pyEngine.CreateScope();
            Source = pyEngine.CreateScriptSourceFromFile(pyPath);
        }

        public void Execute()
        {
            Source.Execute(Scope);
        }
    }
}

GetPage.py:
#!/usr/bin/env python
# -*- coding: windows-1251 -*-
#coding=windows-1251
#encoding=windows-1251

import clr
clr.AddReference("IronPython")
clr.AddReference('IronPython.Modules')

import urllib

user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like     Gecko) Chrome/23.0.1271.95 Safari/537.11"
headers = { 'User-Agent' : user_agent }
result = urllib.urlopen(url, '' ,headers).read().decode('utf-8')

【问题讨论】:

  • 您的 Libs 文件夹必须位于 (python) 路径上。请参阅*.com/q/2224167/468244*.com/a/1756818/468244 了解相关问题/答案。 “如何使用 CPython 标准库?”部分在ironpython.codeplex.com/wikipage?title=FAQ 上似乎也暗示了这个方向。
  • 谢谢,西蒙。我读过这些文章,但我认为 IronPython 标准库可以在没有安装 Python 的情况下使用。我的问题可以通过将Libs复制到应用程序bin目录来解决,我希望存在更多的方法。
  • 在 IronPython.Modules.dll 中实现了一些诸如 bzip2 或 regex 之类的东西,但 urllib(2) 似乎并非如此

标签: .net ironpython


【解决方案1】:

您可以将 Lib 文件夹复制到您的输出目录。如果您希望它在不同的目录中,您可以使用ScriptEngine.SetSearchPaths() 来完全控制库路径。

另一种选择是将标准库放在一个 .zip 文件中并使用 ScriptEngine.SetSearchPaths() 添加它,这至少减少了要发送的文件数量。

【讨论】:

  • 谢谢,杰夫! Zip 是我的最佳解决方案。