2009-06-02 14 views
10

मैं किसी ऐप में कुछ पायथन कोड एम्बेड करने के लिए boost :: पायथन का उपयोग कर रहा हूं। मैं प्रिंट स्टेटमेंट या अन्य अभिव्यक्तियों का मूल्यांकन करने में सक्षम था, लेकिन जब मैं मॉड्यूल आयात करने का प्रयास करता हूं, तो यह आयात नहीं कर रहा है और एप्लिकेशन बाहर निकल रहा है। इसके अलावा एम्बेडेड कोड में ग्लोबल्स() फ़ंक्शन कॉल रनटाइम त्रुटि भी देता है।मैं बूस्ट :: पायथन एम्बेडेड पायथन कोड में मॉड्यूल कैसे आयात करूं?

#include <boost/python.hpp> 

using namespace boost; 
using namespace boost::python; 
using namespace boost::python::api; 

int main(void) { 
    Py_Initialize(); 
    object main_module = import("__main__"); 
    object main_namespace = main_module.attr("__dict__"); 
    main_namespace["urllib2"] = import("urllib2"); 

    object ignored = exec(
      "print 'time'\n", main_namespace); 
} 

यहाँ, मैं बढ़ावा आयात समारोह का उपयोग कर urllib2 आयात करने के लिए कोशिश की है, इस संकलित और ठीक से चलाता है, लेकिन निम्नलिखित कार्यकारी बयान के साथ, यह एक त्रुटि देता है।

object ignored = exec(
      "print urllib2\n" 
      "print 'time'\n", main_namespace); 

या जब मैं बूस्ट आयात फ़ंक्शन को हटाता हूं और एम्बेडेड कोड के भीतर से आयात करता हूं, तो यह एक त्रुटि देता है। मैंने कोशिश करने का प्रयास किया: छोड़कर: ब्लॉक लेकिन यह या तो काम नहीं करता है। क्या ऐसा इसलिए है क्योंकि सी ++ ऐप urllib2 py मॉड्यूल या कुछ का स्थान नहीं ढूंढ पा रहा है? आयात करने की कोशिश करने से पहले मॉड्यूल के पथ को सेट करने का कोई तरीका है?

यह केवल आंतरिक उपयोग के लिए बनाया जा रहा है, इसलिए पथों की कुछ हार्ड कोडिंग स्वीकार्य है।

संपादित करें: अधिक जानकारी:
ऐसा होता है। मैंने कोशिश की .. पकड़ने और PyErr_Print() को कभी भी अपवाद होने पर बुलाया जाता है, और मॉड्यूल आयात या यहां तक ​​कि फ़ंक्शन कॉल होने पर हर बार त्रुटि के रूप में मिलता है। त्रुटि संदेश:

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
TypeError: 'NoneType' object does not support item assignment 

किसी को भी किसी भी कारण के बारे में सोच सकते हैं?

उत्तर

3

इससे मदद नहीं मिली, लेकिन मुझे मेरी समस्या का एक अलग समाधान मिला। मेरे वर्तमान कोड इस तरह दिखता है:

#include <boost/python.hpp> 
#include <iostream> 

using namespace std; 
using namespace boost; 
using namespace boost::python; 
using namespace boost::python::api; 

int main(void) { 
     Py_Initialize(); 
     boost::python::object http = boost::python::import("urllib2"); 

     try 
     { 
       boost::python::object response = http.attr("urlopen")("http://www.google.com"); 
       boost::python::object read = response.attr("read")(); 
       std::string strResponse = boost::python::extract<string>(read); 
       cout << strResponse << endl; 
     } 
     catch(...) 
     { 
       PyErr_Print(); 
       PyErr_Clear(); 
     } 
} 

फिर भी, इस सवाल का जवाब जोनास

+0

@Jonas खुशी है कि आप अपने काम करने वाले कोड मिला है। आपकी इसके साथ क्या करने की इच्छा है? –

+0

ओह। मैं पूरी तरह से सी ++ सॉकेट पुस्तकालयों से बीमार था। उन्हें समझने के लिए समय चाहिए, और चूंकि मैं कंप्यूटर छात्र नहीं हूं, इसलिए मुझे समझने में अधिक समय लगता है। इसलिए मैंने कुछ ऐसा बनाया जो पीठ में पाइथन urllib2 के साथ एक एसिंक्रोनस urllib ++ की तरह लगता है। : डी मुझे पता है कि यह पागल लगता है। लेकिन अब मेरे पास एक बेहद सुविधाजनक समाधान है! – Sahas

+0

हे, आपके लिए अच्छा है! –

4

आप पहले से ही नहीं है, तो आप

 
import sys 
sys.path.append("/home/user/whatever") 

कि कुछ साल पहले अपनी समस्याओं का ध्यान रखा जब बढ़ावा :: अजगर (पायथन v2.5) एम्बेड करने की जरूरत है।

संपादित करें:

पुराने कोड में चारों ओर दबाया गया।

 
Py_SetProgramName(argv[0]); 
Py_InitializeEx(0); 

अनिश्चित ध्वनि है कि तुम सच Py_SetProgramName() की आवश्यकता चाहिए, लेकिन मैं धुँधली-सी कुछ गड़बड़ व्यापार वहाँ याद रखें: शायद यह काम कर देता है।

+0

प्रतिक्रिया के लिए धन्यवाद, और वास्तव में कोशिश करने में देरी और जोनास आपको बता रहा है। मैंने कोशिश की लेकिन यह मदद नहीं कर रहा था। यदि प्रोग्राम में यह एकल कथन "प्रिंट ग्लोबल्स() \ n" है तो मैं प्रोग्राम को चलाने में भी सक्षम नहीं हूं। मैंने विंडोज़ और लिनक्स पर एक ही कोड की कोशिश की, और हर जगह एक ही प्रतिक्रिया। मैं बूस्ट 1.3 9.0 – Sahas

+0

ओप्स का उपयोग कर रहा हूं। मैंने संपादन पर ध्यान नहीं दिया था। मैं भी कोशिश करूंगा। – Sahas

+1

कुछ पुस्तकालयों (जैसे gzip या numpy) आयात करते समय मुझे एक रहस्यमय विभाजन गलती हो रही थी। फिर इस हैक एक आकर्षण की तरह समस्या का हल: 'Py_SetProgramName (" ");' ' Py_InitializeEx (0);' धन्यवाद –

0

मैं तुम्हें, आईईए बहुत ही सरल उदाहरण लेखन त्रुटि में जिसके परिणामस्वरूप के रूप में ही समस्या में पड़ गए, और this question में जवाब मिल गया के लिए धन्यवाद, जो वैश्विक और स्थानीय दोनों के रूप में नामस्थान दो बार आपूर्ति करना था।

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