2011-02-11 25 views
5

Bağlam:Gömme Python C++ uygulama içine

karşı karşıya olan bir sorun olmaya devam ünitesi pazar veri uygulamalarını test olduğunu. Bu uygulamalar, beslemeden alınmakta olan verilere oturur ve gözlemler ve bir şeyler yapar. Çok nadiren tetiklenmesi zor olan bazı kritik olaylar ortaya çıkar ve Test Cihazlarının uygulamalarımızın her koşulda doğru bir şekilde gerçekleştirildiğini doğrulaması zordur, dolayısıyla birim testlerine güvenmek zorundayız.

Bu sistemler genellikle, bir olay meydana geldiğinde geri aramaları (başvurumuza) yayınlayarak çalışır, sonra bununla başa çıkmak görevimiz.

Çözüm Ben öngörülüyor:

Bir test benzemektedir Python REPL ve konu işlev çağrıları ateşlemek diye o mümkün Python gömmek, ya da (bu konuda% 100 net değil) genişletmek mi Daha sonra C++ sınıflarımız tarafından ele alınan geri aramalar. Nesnelerimizin çalışma zamanında bir çeşit dinamik manipülasyonu.

cevap

7

C++ kodunun ilgili bölümleri için python bağlamaları oluşturmak için SWIG kullanarak projelerimden birinde buna benzer bir şey yapıyorum. Sonra tercümanları başkalarının önerdiği gibi yerleştirdim. Bunu yaptıktan sonra, C++ koduna erişebilen (örneğin, PyRun_SimpleString) python kodunu çalıştırabilirim. Normalde, Python'dan özel C++ nesnelerine erişmeyi kolaylaştırmak için Singleton gibi bir şey kullanarak bitiriyorum. Sanal işlevlerin çok daha sezgisel olarak ele alınmasını sağlayan swig python modüllerinde directors belirtilmesi de önemlidir. Yaptığınız şeye bağlı olarak bu çok yardımcı olabilirsiniz.

3

Evet, bu mümkün. Nasıl yapıldığını görmek için bkz. this.

4

Yapmak istediğiniz şey doğru olmak için önemsiz olmasa da mümkündür. Python'u gömmek (uzatmak yerine) vermek istediğiniz gibi geliyor. Her iki konu da eğitici here'da ele alınmıştır.

C++ sınıflarından Python sınıflarına eşleme yapmak için oldukça fazla çalışma var ve özellikle bellek sızıntıları ve çoklu iş parçacıklarıyla (varolan kodunuz çok iş parçacıklıysa) ince yollarla yanlış giden bazı şeyler var. . Ancak, yalnızca bir test durumunda kullanım içinse ve stabilite kritik bir görev değilse, daha az sorun olabilir.