2009-06-16 36 views
8

ben yaparsanız (örneğin)Python C API: özel durumun dize temsili nasıl alınır?

Python
open("/snafu/fnord") 

(ve dosya yok), bir Traceback ve Python en yukarıdaki dize almak istiyorum

IOError: [Errno 2] No such file or directory: '/snafu/fnord' 

mesajı alıyorum C API (bir C programına gömülmüş bir Python yorumlayıcısı). Konsola çıkış olarak değil, bir string olarak ihtiyacım var.

PyErr_Fetch() ile Özel durumun türünü ve değeri alabilirim. Ben Python yorumlayıcısı gösterileri dizeye PyErr_Fetch() aldığım bilgilerden kolay bir yol

(2, 'No such file or directory', '/snafu/fnord') 

var mı: Yukarıdaki Örneğin, değer bir başlık olur? (Her bir özel durum türü için bu tür dizeleri oluşturmayı gerektirmeyen bir tane.)

cevap

6

Python istisnasının, özel durum örneğinde "str()" ifadesini çalıştırarak yazdırıldığını düşünüyorum. Bu, ilgilendiğiniz biçimlendirilmiş dizgiyi döndürecektir. . Sen PyObject_Str() yöntem burada açıklanan arayarak C Bu alabilirsiniz:

https://docs.python.org/c-api/object.html

İyi şanslar!

Güncelleme:PyErr_Fetch() tarafından size iade edilen ikinci öğenin neden bir dizge olduğu konusunda biraz kafam karışık. Benim tahminim, "normalleştirilmemiş bir istisna" almanız ve PyErr_NormalizeException()'u bu tuple, kendisini istediğiniz gibi bir dize olarak biçimlendirebilen bir "gerçek" özel durum haline getirmek için çağırmanız gerektiğidir.

+0

İkinci argüman bir dizi değil, bir tupledır. Ve ben zaten PyErr_NormalizeException() diyoruz. Ancak PyErr_Fetch() bir istisna nesnesi döndürmez, yalnızca istisna türü. Yani istisna nesnesini kendim yaratmalıyım, sanırım? Ve PyErr_Fetch() 'in ikinci argümanını kurucuya iletirim? – ashcatch

+0

Oh, sadece kodumu kontrol ettim ve PyErr_NormalizeException() yöntemini her durumda aramadım. Bunu çağırmak, ikinci argümanı bir istisna nesnesine dönüştürür. Ve bunu PyObject_Str() ile bir dizgeye dönüştürmek istediğim sonucu alır. Çok teşekkürler. – ashcatch

İlgili konular