2013-08-02 8 views
7

मैं f2py का उपयोग कर फोरट्रान में एक पायथन मॉड्यूल बना रहा हूं। अगर मैं फोरट्रान मॉड्यूल में कोई त्रुटि आती है तो मैं पाइथन प्रोग्राम में एक त्रुटि (त्रुटि संदेश सहित) उत्पन्न करना चाहता हूं।f2py का उपयोग कर पाइथन कोड (फोरट्रान) मॉड्यूल त्रुटि रोकें?

फोरट्रान कोड (test.f): निम्नलिखित उदाहरण पर विचार

subroutine foo(a,m) 

    integer :: m,i 
    integer, dimension(m) :: a 
    !f2py intent(in) :: m 
    !f2py intent(in,out) :: a 
    !f2py intent(hide), depend(a) :: m=shape(a) 

    do i = 1,m 
    if (a(i) .eq. 0) then 
     print*, 'ERROR HERE..?' 
    end if 
    a(i) = a(i)+1 
    end do 

end subroutine 

यह बहुत ही सरल कार्यक्रम a के प्रत्येक तत्व को 1 कहते हैं। लेकिन यदि a(i) शून्य के बराबर है तो एक त्रुटि उत्पन्न करनी चाहिए। साथ अजगर कोड:

import test 

print test.foo(np.array([1,2],dtype='uint32')) 
print test.foo(np.array([0,2],dtype='uint32')) 

उत्पादन अब है:

[2 3] 
ERROR HERE..? 
[1 3] 

लेकिन मैं अजगर कार्यक्रम त्रुटि पर पकड़ करना चाहते हैं। कृपया मदद करे।

उत्तर

फोरट्रान में stop आदेश वास्तव में ऐसा करता है। अद्यतन फोरट्रान कोड पर विचार करें:

subroutine foo(a,m) 

    integer :: m,i 
    integer, dimension(m) :: a 
    !f2py intent(in) :: m 
    !f2py intent(in,out) :: a 
    !f2py intent(hide), depend(a) :: m=shape(a) 

    do i = 1,m 
    if (a(i) .eq. 0) then 
     print*, 'Error from Fortran' 
     stop 
    end if 
    a(i) = a(i)+1 
    end do 

end subroutine 

उत्पादन अब है:

[2 3] 
Error from Fortran 

अर्थात पाइथन कोड त्रुटि के बाद जारी नहीं है।

+1

क्या आप फोरट्रान मॉड्यूल से पाइथन अपवाद बढ़ाने की कोशिश कर रहे हैं? – user2357112

+1

हां यह वही है जो मैं –

+3

करने की कोशिश कर रहा हूं, एक तरीका फोरट्रान से एक त्रुटि कोड को फिर से चालू करना होगा, इसे पायथन पक्ष में जांचें, और त्रुटि होने पर अपवाद उठाएं। –

उत्तर

1

f2py कुछ बयान प्रदान करता है जिनका उपयोग अपवादों को बढ़ाने के लिए किया जा सकता है।

http://cens.ioc.ee/projects/f2py2e/usersguide/#statements

विशेष रूप से callstatementf2py_success = 0 जो एक अपवाद को गति प्रदान करेगा जोड़ने का तरीका बताया जो को देखो,: जानकारी यहां देखें।

मुझे यकीन नहीं है कि यह आपको फोर्टन लाइब्रेरी के आंतरिक लोगों को डीबग करने में मदद करेगा, लेकिन कम से कम यह एक शुरुआत है।

1

मैं numpy समुदाय के लिए सुझाव दिया है एक अतिरिक्त f2py "वृद्धि" (raise_python_exception) जो यह संभव फोरट्रान में एक स्ट्रिंग चर को परिभाषित करने के कि अगर गैर खाली अजगर का कारण समारोह एक बार एक अपवाद को बढ़ाने के लिए होगा बनाता जोड़ने जोड़ने के लिए रिटर्न।

तो फोरट्रान में आप की तरह कुछ लिखते थे:

subroutine calc_dq(q, temp, dq, error_mesg) 
    !f2py raise_python_exception error_mesg 

    real, intent(in) :: q, temp 
    real, intent(out) :: dq 

    character(len=100), intent(out) :: error_mesg 

    if (.not. init_called()) then 
    error_mesg = "`init` hasn't been called." 
    else 
    call q_flux_function(q, temp, dq) 
    endif 
end subroutine calc_dq 

और अजगर से कहा जाता error_mesg चर की सामग्री को अपवाद की सामग्री के रूप में इस्तेमाल किया जाता है:

In [2]: calc_dq(1.0, 300.) 
--------------------------------------------------------------------------- 
Exception         Traceback (most recent call last) 
<ipython-input-8-c0ce0cb9cda1> in <module>() 
----> 1 calc_dq(1.0, 300.) 

Exception: `init` hasn't been called. 

मुझे लगता है यह है फोरट्रान से अपवादों को बढ़ाने का एक सुविधाजनक तरीका है क्योंकि यह अपवाद संदेश को आसानी से परिभाषित करने की अनुमति देता है। मैंने अपना suggestion on github रखा है।

+0

'Error_mesg' का मान अन्य सशर्त शाखा में आपके उदाहरण में अपरिभाषित है। –

संबंधित मुद्दे