2011-01-08 12 views
10

मैं एक सी # असेंबली में आयरनपीथन (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; 
    } 
} 

उत्तर

4

मेरा अनुमान है कि आपके ऐप में आप मानक लाइब्रेरी आयात नहीं कर रहे हैं। आयरनपीथन में एक अंतर्निहित सहायता फ़ंक्शन शामिल है और मानक लाइब्रेरी में एक सहायता फ़ंक्शन शामिल है जो site.py द्वारा स्थापित हो जाता है। यदि आप सुनिश्चित करते हैं कि जब आप होस्ट करते हैं तो मानक लाइब्रेरी उपलब्ध होती है और फिर इंजन बनाते समय site.py आयात करते हैं तो आपको मानक लाइब्रेरी सहायता मिलनी चाहिए। ऐसा कहा जा रहा है कि यह शायद एक बग या गायब विशेषता है कि अंतर्निहित सहायता घटनाओं और गुणों को दस्तावेज नहीं कर रही है।

प्रलेखन के संबंध में - हाँ, आपको केवल सी # की डॉक्टर टिप्पणियों का उपयोग करने और /doc:MyAssemblyName.xml विकल्प के साथ निर्माण करने की आवश्यकता है। यदि एक्सएमएल फ़ाइल एक ही निर्देशिका में है क्योंकि असेंबली आयरनपीथन डॉक स्ट्रिंग्स को पढ़ेगी और उन्हें दस्तावेज़ विशेषताओं() को पढ़ने में मदद करता है।

+0

मैं यह सत्यापित करने में सक्षम था कि यह उत्तर सही है, हालांकि मैं प्रोग्रामेटिक रूप से साइट.py आयात करने के तरीके को समझने में सक्षम नहीं हूं। मेरे सत्यापन में ipy.exe (यह एक साधारण .cs फ़ाइल है) का निर्माण शामिल है और ऊपर आईपीआई प्रक्रिया का प्रयास कर रहा है। मुझे टूटे हुए मदद के परिणाम मिलते हैं। यदि मैं इस मानक ipy.exe पर मानक पायथन लाइब्रेरी उपलब्ध कराता हूं, तो मुझे सही सहायता परिणाम मिलते हैं। इसलिए मानक लाइब्रेरी को लोड करने का समाधान माइक्रोसॉफ्ट के कटोरे में गहरा दफनाया गया है। स्क्रिप्टिंग। होस्टिंग या आयरनपीथन। होस्टिंग। ओओ-स्पेगेटी उस गड़बड़ी के लिए एक दयालु शब्द होगा। – Tergiver

+0

मुझे पता चला कि साइट मॉड्यूल को कैसे लोड किया जाए और ऊपर दिए गए मेरे प्रश्न को अपडेट किया जाए। – Tergiver

संबंधित मुद्दे