2013-04-21 37 views
6

Đoạn mã dưới đây trình bằng Python 2:Python 3 thay thế cho PyFile_AsFile

from ctypes import * 

## Setup python file -> c 'FILE *' conversion : 
class FILE(Structure): 
    pass 
FILE_P = POINTER(FILE) 
PyFile_AsFile = pythonapi.PyFile_AsFile # problem here 
PyFile_AsFile.argtypes = [py_object] 
PyFile_AsFile.restype = FILE_P 
fp = open(filename,'wb') 
gd.gdImagePng(img, PyFile_AsFile(fp)) 

Nhưng trong Python 3, không có PyFile_AsFile trong pythonapi.

Mã này ngoại trừ testPixelOps.py.

+0

Có vẻ như có một giải pháp [ở đây] (http://www.salstar.sk/pub/svplayer/vlc.py), nhưng nó sẽ phân biệt đối với tôi. –

+0

Ah, tôi biết lý do tại sao nó bị phân đoạn. Tôi đã sử dụng các mô tả tập tin như một FILE * ... –

+0

Nó là hoàn toàn tốt trả lời câu hỏi của riêng bạn và chấp nhận nó, nếu tất nhiên không có câu trả lời tốt hơn khác – jamylak

Trả lời

9

Tôi chỉ cần một cách để chuyển đổi đối tượng tệp thành một tệp ctypes FILE * để tôi có thể chuyển nó cho GD.

Bạn đã hết may mắn. Điều đó là có thể trong Python 2.x, nhưng không thể trong Python 3.x. Các documentation giải thích tại sao không:

Những API là một thi đua tối thiểu của C API Python 2 cho xây dựng trong các đối tượng tập tin, trong đó sử dụng để dựa vào đệm I/O (FILE *) hỗ trợ từ các tiêu chuẩn C thư viện. Trong Python 3, các tệp và luồng sử dụng mô-đun io mới, định nghĩa một số lớp trên I/O không cấp thấp của hệ điều hành.

Nếu bạn muốn có một FILE* bạn sẽ phải tự mình làm, sử dụng thư viện chuẩn C trực tiếp.

+0

Cảm ơn bạn David, tôi đã ngu ngốc vì không đọc tiêu đề của trang tài liệu đó. –

2

Tôi không tìm thấy câu trả lời thực sự cho vấn đề, nhưng tôi phát hiện ra rằng nếu bạn không cần chuyển đổi đối tượng tệp Python thành FILE* (nghĩa là, bạn không cần phải "chia sẻ" mở tệp), bạn chỉ có thể sử dụng ctypes để gọi fopen từ libc và nhận số FILE* như thế.

+1

Và [câu trả lời này] (http://stackoverflow.com/a/17257911) cho biết cách gọi 'fopen' từ' libc'. Cảm ơn. – Rafa