2011-01-08 27 views
10

私はIronPython(2.6.1)をC#アセンブリに埋め込み、PythonEngine.ExecuteFileで実行されるスクリプトにいくつかのオブジェクトを公開します。私は、スクリプトはそれらを使用する方法に応じていずれかIronPython、組み込みヘルプコマンド、CLRオブジェクトを組み込む

scope.SetVariable("SomeObject", new SomeObject()) 

または

engine.Execute("from MyNamespace import SomeObject", scope) 

でそれらを公開します。私のアプリケーションアセンブリは、今すぐスクリプトはしかしそれは不完全だ、help(SomeObject)を実行して、ちょっといいヘルプ情報(*)をダンプすることができ

engine.Runtime.LoadAssembly(Assembly.GetExecutingAssembly()) 

でエンジンに追加されます。オブジェクトのイベントやプロパティ(公開されているもの)のどれも表示されず、多くの '組み込み'メンバーも欠落しています。

ここには奇妙な部分があります。 ipy.exeを起動して次のコマンドを実行すると、

import sys 
sys.path.append('<location of my app>') 
import clr 
clr.AddReferenceToFile('myapp.exe') 
from MyNamespace import SomeObject 
help(SomeObject) 

私は別のダンプを取得しました。

2つの違いは何ですか?

ボーナスの質問:正しく動作すると仮定すると、CLRオブジェクトの説明テキストをhelp()の出力に追加できますか?あなたはスクリプト内から、あなたのpython-native型のようにすることができますか?私の最初の推測はDescriptionAttributeでしたが、うまくいきませんでした。

(*)明らかに最終的な作業スクリプトはこれを実行しませんが、スクリプトを作成/テストする際には非常に役立ちます。

)は、(標準のPythonライブラリの助けを借りて)ここで

を回答usless内部助けを(置き換えるサイトをインポートする方法を示し、完全なコンソールプログラムです。

using System; 
using System.Collections.Generic; 
using System.Reflection; 
using IronPython.Hosting; 
using IronPython.Runtime; 
using Microsoft.Scripting.Hosting.Providers; 

namespace MyApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Work around issue w/ pydoc - piping to more doesn't work so instead indicate that we're a dumb terminal 
      if (Environment.GetEnvironmentVariable("TERM") == null) 
       Environment.SetEnvironmentVariable("TERM", "dumb"); 

      var engine = Python.CreateEngine(); 

      // Add standard Python library path (is there a better way to do this??) 
      PythonContext context = HostingHelpers.GetLanguageContext(engine) as PythonContext; 
      ICollection<string> paths = context.GetSearchPaths(); 
      paths.Add(@"C:\Program Files (x86)\IronPython 2.6\Lib"); 
      context.SetSearchPaths(paths); 

      // Import site module 
      engine.ImportModule("site"); 

      engine.Runtime.LoadAssembly(Assembly.GetEntryAssembly()); 

      var scope = engine.CreateScope(); 
      scope.SetVariable("SomeObject", new SomeObject()); 
      engine.Execute("help(SomeObject)", scope); 
     } 
    } 

    /// <summary> 
    /// Description of SomeObject. 
    /// </summary> 
    public class SomeObject 
    { 
     /// <summary> 
     /// Description of SomeProperty. 
     /// </summary> 
     public int SomeProperty { get; set; } 
     /// <summary> 
     /// Description of SomeMethod. 
     /// </summary> 
     public void SomeMethod() { } 
     /// <summary> 
     /// Description of SomeEvent. 
     /// </summary> 
     public event EventHandler SomeEvent; 
    } 
} 

答えて

4

私の推測では、あなたのアプリケーションでは、標準ライブラリをインポートしていないということです。 IronPythonにはヘルプ機能が組み込まれており、標準ライブラリにはsite.pyによってインストールされるヘルプ機能が含まれています。エンジンを作成するときにsite.pyをホストしてインポートするときに標準ライブラリが使用できることを確認したら、標準ライブラリヘルプを入手する必要があります。それはおそらく、組み込みのヘルプがイベントやプロパティを文書化していないというバグや不足している機能だと言われています。

ドキュメンテーションについて - はい、C#のドキュメントコメントを使用し、/doc:MyAssemblyName.xmlオプションを使用してビルドする必要があります。 XMLファイルがアセンブリと同じディレクトリにある場合、IronPythonはdoc文字列を読み込み、docの属性にhelp()を渡して読み取ります。

+0

この回答が正しいことを確認できましたが、私は(これまで)site.pyをプログラム的にインポートする方法を理解することはできません。私の検証は、ipy.exeを構築すること(これは単純な.csファイルのすべてです)と上記のipy手順を試していました。私は壊れた助けの結果を得る。この新しいipy.exeで標準のPythonライブラリを利用できるようにすれば、正しいヘルプ結果が得られます。したがって、標準ライブラリを読み込むソリューションは、Microsoft.Scripting.HostingまたはIronPython.Hostingのボウルに埋め込まれています。 OO-Spaghettiはその混乱のための親切な言葉でしょう。 – Tergiver

+0

サイトモジュールをロードして上記の質問を更新する方法を知りました。 – Tergiver