2011-10-13 13 views
8

मैं अपने टेस्ट सूट एप्लिकेशन में पायथन को एम्बेड करने पर काम कर रहा हूं। इसका उद्देश्य डेटा एकत्र करने और परीक्षणों की रिपोर्ट करने के लिए कई परीक्षण स्क्रिप्ट चलाने के लिए पायथन का उपयोग करना है। एक टेस्ट रन के लिए एकाधिक टेस्ट स्क्रिप्ट वैश्विक चर और फ़ंक्शंस बना सकती हैं जिनका उपयोग अगली लिपि में किया जा सकता है।एक एम्बेडेड पायथन दुभाषिया को फिर से शुरू करने के लिए कैसे?

एप्लिकेशन एक्सटेंशन मॉड्यूल भी प्रदान करता है जो एम्बेडेड दुभाषिया में आयात किए जाते हैं, और एप्लिकेशन के साथ कुछ डेटा का आदान-प्रदान करने के लिए उपयोग किए जाते हैं।

लेकिन उपयोगकर्ता कई परीक्षण रन भी बना सकता है। मैं उन ग्लोबल्स, आयात और कई परीक्षण रनों के बीच आदान-प्रदान डेटा साझा नहीं करना चाहता हूं। मुझे यह सुनिश्चित करना होगा कि मैं परीक्षण वातावरण को नियंत्रित करने और एक ही परिणाम प्राप्त करने के लिए एक वास्तविक स्थिति में पुनरारंभ करता हूं।

मुझे दुभाषिया को फिर से शुरू करना चाहिए?

मैंने Py_Initialize() और Py_Finalize() का उपयोग किया, लेकिन दूसरी बार शुरू होने पर अपवाद प्राप्त करें जब मैं दुभाषिया को प्रदान किए गए एक्सटेंशन मॉड्यूल को दूसरी बार शुरू करता हूं। और प्रलेखन warns against using it more than once

sub-interpreters का उपयोग एक्सटेंशन मॉड्यूल प्रारंभ के साथ समान चेतावनी है।

मुझे संदेह है कि मैं अपने विस्तार मॉड्यूल की शुरुआत के साथ कुछ गलत कर रहा हूं, लेकिन मुझे डर है कि तीसरी पार्टी एक्सटेंशन मॉड्यूल के साथ एक ही समस्या होती है।

शायद दुभाषिया को अपनी प्रक्रिया में लॉन्च करके इसे काम करना संभव है, ताकि यह सुनिश्चित किया जा सके कि सभी मेमोरी जारी हो जाएं।

वैसे, मैं इसके लिए बूस्ट-पायथन का उपयोग कर रहा हूं, जो कि Py_Finalize का उपयोग करके पुन: चेतावनी देता है!

कोई सुझाव?

धन्यवाद

उत्तर

4

अजगर में लिखने यहाँ एक और तरीका मैं प्राप्त करने के लिए मैं क्या चाहते हैं, दुभाषिया में एक साफ स्लेट के साथ शुरू पाया जाता है।

मैं वैश्विक और स्थानीय नामस्थान मैं कोड को निष्पादित करने का उपयोग को नियंत्रित कर सकते हैं:

// get the dictionary from the main module 
// Get pointer to main module of python script 
object main_module = import("__main__"); 
// Get dictionary of main module (contains all variables and stuff) 
object main_namespace = main_module.attr("__dict__"); 

// define the dictionaries to use in the interpreter 
dict global_namespace; 
dict local_namespace; 

// add the builtins 
global_namespace["__builtins__"] = main_namespace["__builtins__"]; 

मैं तो pyCode में निहित कोड के निष्पादन के लिए नामस्थान का उपयोग का उपयोग कर सकते हैं:

exec(pyCode, global_namespace, lobaca_namespace); 

मैं कर सकते हैं जब मैं शब्दकोशों की सफाई करके अपने परीक्षण का एक नया उदाहरण चलाने के लिए नामस्थान साफ़ करता हूं:

// empty the interpreters namespaces 
global_namespace.clear(); 
local_namespace.clear();   

// Copy builtins to new global namespace 
global_namespace["__builtins__"] = main_namespace["__builtins__"]; 

मैं किस स्तर पर निष्पादन चाहता हूं, मैं वैश्विक = स्थानीय

0

कैसे code.IteractiveInterpreter का उपयोग कर के बारे में?

कुछ इस तरह यह करना चाहिए:

#include <boost/python.hpp> 
#include <string> 
#include <stdexcept> 

using namespace boost::python; 

std::string GetPythonError() 
{ 
    PyObject *ptype = NULL, *pvalue = NULL, *ptraceback = NULL; 
    PyErr_Fetch(&ptype, &pvalue, &ptraceback); 
    std::string message(""); 
    if(pvalue && PyString_Check(pvalue)) { 
     message = PyString_AsString(pvalue); 
    } 
    return message; 
} 

// Must be called after Py_Initialize() 
void RunInterpreter(std::string codeToRun) 
{ 
    object pymodule = object(handle<>(borrowed(PyImport_AddModule("__main__")))); 
    object pynamespace = pymodule.attr("__dict__"); 

    try { 
     // Initialize the embedded interpreter 
     object result = exec( "import code\n" 
           "__myInterpreter = code.InteractiveConsole() \n", 
           pynamespace); 
     // Run the code 
     str pyCode(codeToRun.c_str()); 
     pynamespace["__myCommand"] = pyCode; 
     result = eval("__myInterpreter.push(__myCommand)", pynamespace); 
    } catch(error_already_set) { 
     throw std::runtime_error(GetPythonError().c_str()); 
    } 
} 
+0

का उपयोग कर सकता हूं तो मूल रूप से, मुझे अपने पायथन दुभाषिया को तुरंत चालू करना चाहिए, और उप-दुभाषियों को लॉन्च करने के लिए इस दुभाषिया का उपयोग करना चाहिए, कि उनके पास अपना स्वयं का नामस्थान है? एक व्यावहारिक समाधान की तरह दिखता है, यदि इन सबिनटरप्रेटर एक ही चेतावनी से पीड़ित नहीं हैं जैसे कि Py_NewInterpreter के साथ बनाया गया है। मैं उसमें विवरण देखता हूं और इसके साथ प्रयोग करता हूं। धन्यवाद! – nab

+0

आपको यह मिला। एक इंटरेक्टिवइंटरप्रेटर को इंस्टेंट करना आपको हर बार एक नया वातावरण देता है। मुझे यकीन नहीं है कि माता-पिता दुभाषिया से विरासत में क्या है, इसके बारे में नियम क्या हैं, लेकिन इसे किसी भी तरह से नियंत्रित करना आसान होना चाहिए। –

+0

ऐसा लगता है जो मैं चाहता हूं। ध्यान दें कि मॉड्यूल प्रारंभिकरण के लिए यह वही कमी है (वे केवल एक बार आरंभ किए जाते हैं)। लेकिन यह नामस्थान को साफ करने के लिए अच्छी तरह से काम करता है। धन्यवाद! – nab

0

मैं हर बार अजगर के नए उदाहरणों के साथ परीक्षण स्क्रिप्ट के अनुक्रम को क्रियान्वित एक और खोल स्क्रिप्ट लिखने चाहते हैं। या जैसे

# run your tests in the process first 
# now run the user scripts, each in new process to have virgin env 
for script in userScript: 
    subprocess.call(['python',script]) 
संबंधित मुद्दे