मैं पाइथ्रन के साथ काम कर रहा हूं, एक पायथन से c++ कंपाइलर http://pythran.readthedocs.io/

अपने मैनुअल पेज में, पाइथ्रान का कहना है कि यह write से write विधि का समर्थन करता है। TextIOWrapper

हालाँकि, इस साधारण फ़ाइल को संकलित करने का प्रयास कर रहा है

फ़ाइल: mylib.py

#pythran export write_test(str,bool)
#pythran export fake_write(str)

def write_test(fname,r):
    if r:
        print('writing %s'%fname)
        f = open(fname,'w')
        #write_line = f.writelines
        write_line = f.write
    else:
        print('NO FILE WILL BE WRITTEN')
        write_line = fake_write
    for i in range(10):
        write_line(str(i) + '\n')
    if r:
        f.close()

def fake_write(s):
    return 0

कमांड लाइन के साथ

पाइथ्रान mylib.py -o mylib.so -O3 -march=native -v

संदेश के साथ विफल:

mylib.py:9:21 त्रुटि: इस ऑब्जेक्ट के लिए असमर्थित विशेषता 'लिखें'

पाइथ्रन संस्करण: 0.9.8.post2

पायथन संस्करण: 3.8.5

उबंटू 20.04.1 एलटीएस का उपयोग करना

0
Girardi 4 जिंदा 2021, 01:07

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा लगता है कि पाइथ्रन के वर्तमान संस्करण में एक बग है। यह पाइथ्रान (0.9.9.dev) के विकास संस्करण में तय किया गया था।

f.write फ़ंक्शन के लिए एक पॉइंटर का उपयोग करने के बजाय, हम एक lambda को बिना किसी रिटर्न के परिभाषित कर सकते हैं जो काम करता है और समस्या को हल करता है:

#pythran export write_test(str,bool)
#pythran export fake_write(str)

def write_test(fname,r):
    if r:
        print('writing %s'%fname)
        f = open(fname,'w')
        #write_line = f.writelines
        write_line = lambda s: f.write(s)
    else:
        print('NO FILE WILL BE WRITTEN')
        write_line = fake_write
    for i in range(10):
        write_line(str(i) + '\n')
    if r:
        f.close()

def fake_write(s):
    return None

इस संशोधन की सलाह डेवलपर्स ने अपने github बग रिपोर्ट पेज में दी थी।

0
Girardi 6 जिंदा 2021, 08:04