2012-03-21 14 views
8

Python'u tanımlanmış bir API'ye sahip bir C/C++ uygulamasına yerleştiriyorum. Bu kullanarak halletmek için I (kanıtı konsepti için) geçmişte başardınızGömülü Python 2.7.2 Kullanıcı tanımlı bir dizinden bir modülün içe aktarılması

class userscript1: 
    def __init__(self): 
     ##do something here... 

    def method1(self): 
     ## method that can be called by the C/C++ app...etc 

:

uygulama böyle kabaca yapılandırılmıştır bir komut dosyası tanımlanan sınıfları, örneğini gerekiyor aşağıdaki kod türü: Şimdi bir üretim ortamında daha fazlasında olduğumu

PyObject* pName = PyString_FromString("userscript.py"); 
PyObject* pModule = PyImport_Import(pName); 
PyObject* pDict = PyModule_GetDict(pModule); 
PyObject* pClass = PyDict_GetItemString(pDict, "userscript"); 
PyObject* scriptHandle = PyObject_CallObject(pClass, NULL); 

, bu PyImport_Import hattında başarısız - Ben komut dosyasına bir dizin prepend çalışıyorum çünkü bu olabileceğini düşünüyorum isim, örneğin

PyObject* pName = PyString_FromString("E:\\scriptlocation\\userscript.py"); 

Şimdi, size ne denedim hakkında bir fikir vermek için, ben bu modül için arama yapmak için bu çağrıların hepsi önce sistem yolunu değiştirerek çalıştı. Temelde modifiye sys.path programlı çalıştı:

PyObject* sysPath = PySys_GetObject("path"); 
PyObject* path = PyString_FromString(scriptDirectoryName); 
int result = PyList_Insert(sysPath, 0, path); 

Bu satırlar Tamam çalıştırmak ama benim kod çalışmasını sağlamak üzerinde hiçbir etkisi yoktur. Açıkçası, benim gerçek kodum, dışarıda bıraktığımı kontrol etmek için bir tekne hatası hatası veriyor, bu yüzden endişelenme!

Sorularım: Katıştırılmış yorumlayıcıyı komut dosyalarına uygun şekilde yönlendiririm böylece sınıfları başlatabilirim?

cevap

16

sen userscript değil userscript.py da doğrudan sürer PyImport_ImportModule kullanmak belirtmek gerekir bir char *

userscript.py

bu kod paketinin userscript

modülü py demektir benim için çalışıyor:

#include <stdio.h> 
#include <stdlib.h> 
#include <Python.h> 

int main(void) 
{ 
    const char *scriptDirectoryName = "/tmp"; 
    Py_Initialize(); 
    PyObject *sysPath = PySys_GetObject("path"); 
    PyObject *path = PyString_FromString(scriptDirectoryName); 
    int result = PyList_Insert(sysPath, 0, path); 
    PyObject *pModule = PyImport_ImportModule("userscript"); 
    if (PyErr_Occurred()) 
     PyErr_Print(); 
    printf("%p\n", pModule); 
    Py_Finalize(); 
    return 0; 
} 
+1

- çok teşekkürler Bu beni duvardan geçirdi! Şimdi test senaryosunda neyin yanlış olduğunu bulmak için arıyorum! – Fritz

+0

Python 3'te PyString_FromString gitti. Bunun yerine PyBytes_FromString kullanın. – edj

İlgili konular