2011-09-02 17 views
6
Ben Documentation göre C için Embedded Python kullanarak sorun yaşıyorum

- Ben ithal modülleri kullanmayı deneyin zaman alıyorum bir:Gömme Python - ithal modüllerin

PythonIncl.exe içinde 0x1e089e85 de

İşlenmemiş istisna: 0xC0000005: Erişim ihlali okuma konumu 0x00000004.

Hata, PyObject_GetAttrString() yönteminde gerçekleşir ve belgeler çok yardımcı olmaz. Ayrıca, IBM'den bir Example'daki gibi öğreticiler kullanmayı denedim, ancak her zaman aynı erişim ihlali elde ettim.

Aşağıdakiler, işe yaramıyor gibi görünen öğreticilerin örnek kodudur, burada sorun nedir?

C-Kodu (bir ana dosyası):

#include <Python.h> 
int main() 
{ 
    PyObject *strret, *mymod, *strfunc, *strargs; 
    char *cstrret; 
    Py_Initialize(); 
    mymod = PyImport_ImportModule("reverse"); 
    strfunc = PyObject_GetAttrString(mymod, "rstring"); 
    strargs = Py_BuildValue("(s)", "Hello World"); 
    strret = PyEval_CallObject(strfunc, strargs); 
    PyArg_Parse(strret, "s", &cstrret); 
    printf("Reversed string: %s\n", cstrret); 
    Py_Finalize(); 
    return 0; 
} 

Python kodu (bir dosya adı verilen reverse.py içinde, aynı klasör):

def rstring(s): 
    i = len(s)-1 
    t = '' 
    while(i > -1): 
     t += s[i] 
     i -= 1 
    return t 

kullanıyorum bir XP makine çalıştırıyorum MSVS2008, Python 2.7

Biraz bağlam: Oldukça geniş bir C programında OpenOPC kullanan küçük bir python komut dosyasını gömmeye çalışıyorum ve ikisi arasında veri aktarmak istiyorum. Ancak, temel örneklerle bir kavram kanıtı testinde başarısız oldum.

+2

Bir python'un vücudunu girintilendirmeniz gerektiğini biliyor musunuz? – Griwes

+1

Python'u gömmek yerine Python için bir uzantı yazmak neredeyse her zaman daha güzel ve daha güçlüdür. Bunu yapmak oldukça benzer gözükür, ancak genişletmek için daha iyi bir takım vardır ve gerektiğinde diğer Python araçlarına erişmek daha kolaydır. Gömme ve yaymaya ilişkin bir perspektif için http://twistedmatrix.com/users/glyph/rant/extendit.html adresine bakın. –

+0

evet, eksik girinti hakkında, sadece gönderme sırasında kayboldu, IDE'de var. – Shorkaa

cevap

14

PyImport_ImportModule aramasının sonucunu kontrol edin: NULL başarısız olur ve döner. Bunun nedeni, varsayılan olarak, geçerli dizinin arama yolunda olmamasıdır. Geçerli dizini modül arama yoluna eklemek ve örnek çalışmanızı sağlamak için

.

+0

'PySys_SetPath (". ")', Arama yolunu temizler/üzerine yazar. Daha iyi [ekle] (http://stackoverflow.com/a/8859538/6394138). – Leon

2

Hata kontrolü yapmadan devam ediyorsunuz, bu nedenle kodunuzun bu şekilde başarısız olması hiç de şaşırtıcı değil. Açıklamanızdan dolayı, mymod'un NULL olduğu gibi başarısız bir içe aktarma ile tutarlı olacaktır. Başarısız içeri aktarmanın olası bir nedeni, gönderdiğiniz posta adresinin reverse.py sözdizimi hatası olmasıdır.