在 pythran 中写入文本文件失败

write text files in pythran fails

我正在使用 pythran,一个 Python 到 c++ 的编译器 http://pythran.readthedocs.io/

在其手册页中,pythran says it supports the method write from 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

使用命令行

pythran mylib.py -o mylib.so -O3 -march=native -v

失败并显示消息:

mylib.py:9:21 error: Unsupported attribute 'write' for this object

Pythran 版本:0.9.8.post2

Python版本:3.8.5

使用 Ubuntu 20.04.1 LTS

当前版本的pythran好像有bug。它在 pythran (0.9.9.dev) 的开发版本中被修复。

不使用指向 f.write 函数的指针,我们可以定义一个没有 return 的 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 bug report page.

中建议进行此修改