2010-12-14 19 views
6

Farz edelim ki, aşağıdaki gibi tanımlanmış iki yükseltme python modülüne sahibim. Modül A:Boost Python'daki çapraz modül bağımlılıkları

class SomeClass { 
public: 
    SomeClass() {} 
    ~SomeClass() {} 
}; 
BOOST_PYTHON_MODULE(A) 
{ 
    class_<SomeClass>("SomeClass"); 
} 

ve modül B:

class AnotherClass { 
public: 
    AnotherClass() {} 
    ~AnotherClass() {} 
    void func(SomeClass& sp) {} 
}; 
BOOST_PYTHON_MODULE(B) 
{ class_<AnotherClass>("AnotherClass") 
     .def("func", &AnotherClass::func) 
    ; 
} 

Modül B modül A bir bağımlılık (yani, modül A SomeClass kullanır) sahiptir. Python otomatik modüller arasında sınıfları tercüme etmediğini görünüyor

Traceback (most recent call last): 
    File "C:\bladiebla\script.py", line 8, in <module> 
    obj2.func(obj1) 
ArgumentError: Python argument types in 
AnotherClass.func(AnotherClass, SomeClass) 
did not match C++ signature: 
func(class AnotherClass {lvalue}, class SomeClass) 

:

import A 
import B 
obj1 = A.SomeClass() 
obj2 = B.AnotherClass() 
obj2.func(obj1) 

aşağıdaki hatayı alıyorum: Şimdi, aşağıdaki python komut dosyası yürütün. Bunu çözmenin bir fikri var mı?

cevap

0

Sorunuza en son yanıt ve güncelleştirilmiş hata iletinize dayanarak, bu sorunun nedeni BOOST_PYTHON_MODULE kullanımınızın yanlış olabileceğinden kaynaklanıyor olabilir (başka örneklerde gördüğünüz öğelere göre). Böyle bir şey deneyin ve yardımcı olmadığını görmek:

Modül A:

class SomeClass { 
public: 
    SomeClass() {} 
    ~SomeClass() {} 
}; 
BOOST_PYTHON_MODULE(A) 
{ 
    boost::python::class_<SomeClass>("SomeClass"); 
} 

Ve modül B:

class AnotherClass { 
public: 
    AnotherClass() {} 
    ~AnotherClass() {} 
    void func(SomeClass& sp) {} 
}; 
BOOST_PYTHON_MODULE(B) 
{ boost::python::class_<AnotherClass>("AnotherClass") 
     .def("func", &AnotherClass::func) 
    ; 
} 

Not her class_<...> açıklamada üzerine "boost::python::" öneki ekleme İki BOOST_PYTHON_MODULE beyannamesi.

+0

Merhaba, geri bildiriminiz için çok teşekkür ederim. Ancak, bu sorunu miras ilişkisine sahip olmayan iki sınıf için çözmek istiyorum. Örneğin, 'SomeClass' aslında 'Triangle' sınıfı ve 'AnotherClass' sınıfının 'Polygon' sınıfı olduğunu düşünebilirsiniz. Kesinlikle Poligon'un Üçgen'den miras almasını istemiyorum çünkü OO bakış açısından anlam ifade etmiyor. Öyleyse, birbirlerinden miras almayan farklı modüllerdeki iki sınıfı nasıl alabilirim, ama orijinal örneğimde olduğu gibi, Python aracılığıyla birbirimizi kullanıyorlar? – Arjan

+0

'func()' 'SomeClass' argümanını istiyor. Eğer 'AnotherClass' gibi farklı bir şeyden geçmek istiyorsanız, bunu ** yapmadan ** yapabiliyorsunuz. 'AnotherClass', 'SomeClass' dan 'SomeClass' 'a bir argüman olarak bir' AnotherClass 'alan bir kurucu ekleyerek' SomeClass'dan miras alıyor. Alternatif olarak, bir 'AnotherClass' argümanını kabul eden ve' SomeClass' örneğini döndüren bir şey yazabilirsiniz, ancak bunu açıkça belirtmek zorunda kalacaksınız.Eğer böyle bir şey yapamazsan, o zaman sıkışmış olduğunu düşünüyorum - neyse func() neyse ne yapması gerekiyorsa, keyfi bir dersten geçtiğinde bunun hakkında hiçbir şey bilmiyor? – martineau

+0

Evet, bunu anlıyorum, ancak bu işleve farklı bir şey iletmek istemiyorum, sadece bazı türler için bir argüman var. Python betiği örneğinde, benim obj1, A.SomeClass tipindedir. B.AnotherClass ile ilgisi yoktur. B.AnotherClass'daki 'func', obj1 gibi A.SomeClass tipindeki parametreleri kabul etmelidir. – Arjan

6

Kısa bir süre önce Boost.Python ile uğraşmaya başladım ve aynı problemi yaşadım. Aşağıdaki dokümanın

Kontrol dışarı bölüm 6:

http://www.boost.org/doc/libs/1_47_0/libs/python/doc/building.html

6,1 - Dinamik İkili

kütüphane bir tür dönüşüm kayıt içerir. Tüm kayıt modülleri arasında bir kayıt defteri paylaşıldığı için, dinamik olarak yüklenmiş bir uzantı modülünde Python'a maruz bırakılan bir sınıfın örnekleri, başka bir modülünde bulunan işlevlere iletilebilir.

Statik ikili kullanıyordum ve aldığınızla aynı türde bir hatayı aldım. Dinamik ikiliye geçtikten sonra derledim ve iyi çalıştı.