3

NuGet を介して IronPython 標準ライブラリを c#.net4 プロジェクトに追加し、後でいくつかの参照 (IronPython、IronPython.Modules、IronPython.SQLite、IronPython.Wpf、Microsoft.Dynamic、Microsoft.Scripting など) と 'Lib' フォルダーを取得しました。 python モジュールが含まれています。今、「urllib」モジュールを my file.py にインポートしようとしていますが、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')
4

1 に答える 1

5

Lib フォルダーを出力ディレクトリにコピーできます。別のディレクトリに置きたい場合はScriptEngine.SetSearchPaths()、ライブラリ パスを完全に制御するために使用できます。

もう 1 つのオプションは、標準ライブラリを .zip ファイルに入れ、それを を使用して追加することですScriptEngine.SetSearchPaths()。これにより、少なくとも送信するファイルの数が減ります。

于 2012-12-14T17:06:36.607 に答える