मैं एक सी # असेंबली में आयरनपीथन (2.6.1) एम्बेड कर रहा हूं और पाइथनइंजिन.एक्सक्यूटफाइल के साथ निष्पादित स्क्रिप्ट पर कई ऑब्जेक्ट्स को उजागर कर रहा हूं। मैं उन्हें या तोआयरनपीथन को एम्बेड करना, अंतर्निहित सहायता कमांड, मेरी सीएलआर ऑब्जेक्ट्स
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 वस्तुओं पर वर्णनात्मक पाठ जोड़ना संभव है()? जैसा कि आप स्क्रिप्ट के भीतर से अपने पाइथन-मूल प्रकारों पर कर सकते हैं? मेरा पहला अनुमान विवरण एट्रिब्यूट था, लेकिन यह काम नहीं किया।
(*) स्पष्ट रूप से एक अंतिम, काम करने वाली स्क्रिप्ट यह नहीं करेगी लेकिन स्क्रिप्ट लिखने/परीक्षण करते समय यह बहुत उपयोगी है।
उत्तर यहां एक संपूर्ण सांत्वना कार्यक्रम साइट है जो मानक अजगर पुस्तकालय मदद से 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;
}
}
मैं यह सत्यापित करने में सक्षम था कि यह उत्तर सही है, हालांकि मैं प्रोग्रामेटिक रूप से साइट.py आयात करने के तरीके को समझने में सक्षम नहीं हूं। मेरे सत्यापन में ipy.exe (यह एक साधारण .cs फ़ाइल है) का निर्माण शामिल है और ऊपर आईपीआई प्रक्रिया का प्रयास कर रहा है। मुझे टूटे हुए मदद के परिणाम मिलते हैं। यदि मैं इस मानक ipy.exe पर मानक पायथन लाइब्रेरी उपलब्ध कराता हूं, तो मुझे सही सहायता परिणाम मिलते हैं। इसलिए मानक लाइब्रेरी को लोड करने का समाधान माइक्रोसॉफ्ट के कटोरे में गहरा दफनाया गया है। स्क्रिप्टिंग। होस्टिंग या आयरनपीथन। होस्टिंग। ओओ-स्पेगेटी उस गड़बड़ी के लिए एक दयालु शब्द होगा। – Tergiver
मुझे पता चला कि साइट मॉड्यूल को कैसे लोड किया जाए और ऊपर दिए गए मेरे प्रश्न को अपडेट किया जाए। – Tergiver