Встраивание IronPython, встроенная команда справки, мои объекты CLR - PullRequest
10 голосов
/ 08 января 2011

Я встраиваю IronPython (2.6.1) в сборку C # и предоставляю несколько объектов сценариям, которые выполняются с помощью PythonEngine.ExecuteFile.Я выставляю их с помощью

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

или

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

в зависимости от того, как их используют сценарии.Моя сборка приложения добавляется в движок с помощью

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

Теперь скрипт может выполнить help(SomeObject) и вывести полезную небольшую справочную информацию (*), однако она неполная .Ни одно из событий или свойств объекта (общедоступных, конечно) не отображается, и многие из «встроенных» членов также отсутствуют.

Вот странная часть;Если я запускаю ipy.exe и выполняю следующее:

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

Я получаю другой дамп, в котором есть все недостающие элементы!

Почему они различаются?

Бонусный вопрос : Если предположить, что он работает правильно, возможно ли добавить описательный текст на моих объектах CLR к выводу help ()?Как вы можете из скрипта, на ваших Python-нативных типах?Моим первым предположением был DescriptionAttribute, но это не сработало.

(*) Очевидно, что последний работающий скрипт не будет этого делать, но он чрезвычайно полезен при написании / тестировании скрипта.

Отвечено

Вот полная консольная программа, иллюстрирующая, как импортировать сайт, который заменяет бесполезную внутреннюю справку () на стандартную библиотеку python help ().

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;
    }
}

1 Ответ

4 голосов
/ 09 января 2011

Я предполагаю, что в вашем приложении вы не импортируете стандартную библиотеку.IronPython включает встроенную функцию помощи, а стандартная библиотека включает функцию помощи, которая устанавливается site.py.Если вы убедитесь, что стандартная библиотека доступна, когда вы размещаете ее, а затем импортируете site.py при создании движка, вам следует получить справку по стандартной библиотеке.При этом, вероятно, это ошибка или отсутствующая функция, из-за которой встроенная справка не документирует события и свойства.

Что касается документации - да, вам просто нужно использовать комментарии doc на C # и собрать с / doc: Опция MyAssemblyName.xml.Если файл XML находится в том же каталоге, что и сборка, IronPython будет считывать строки документа и предоставлять их для атрибутов doc , которые help () затем читает.

...