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