2010-03-06 28 views
0

有沒有辦法爲pycurl的READFUNCTION寫回調函數,它不返回字符串?我正計劃通過pycurl發送二進制數據塊。我試着寫一個回調函數,這是否:pycurl READFUNCTION與字節流

def read_callback(self, size): 
    for block in data: 
    yield block 

但pycurl退出時,說的返回類型必須是一個字符串錯誤。

回答

1

「讀取函數」必須返回一串字節 - 記住,libcurl是一個底層C庫的包裝,所以當然它是類型挑剔的!)。然而,它完全可以是一個二進制字節串(至少在Python 2.*中 - 我不認爲pycurl可以與Python 3一起工作),所以它當然可以返回「二進制數據塊」 - 只要它們重新編碼成字節串並遵守size約束。

剛剛編碼的東西在調用時會返回一個「生成器函數」 - 顯然沒有用。假設data是一個非空字節字符串的列表,您需要對它進行切塊和切片,每次返回一個字節字符串,其中return,肯定是而不是yield(!)。

不確定那個神祕的data來自哪裏 - 讓我們假設你的意思是代替self.data。然後,您需要在當前索引的其他實例變量中跟蹤self.data,並且可能 - 如果這些項目的長度大於size - 也是當前索引的「未發送部分」。

例如,它可能是:

class MySender(object): 
    def __init__(self, data): 
    self.data = data 
    self.i = 0 
    self.rest = 0 
    def readfunction(self, size): 
    if self.i >= len(self.data): 
     return '' 
    result = self.data[self.i][self.rest:self.rest+size] 
    self.rest += size 
    if self.rest >= len(self.data[self.i]): 
     self.i += 1 
     self.rest = 0 

如果self.data的項目是其他類型的二進制數據(尚未編碼爲字節字符串),你可以把它們變成字節串例如在Python庫模塊的幫助下,如structarray

+0

我明白了。我沒有寫回調函數,而是使用了cStringIO。我只是將數據塊寫入cStringIO實例,並將cStringIO實例的讀取函數傳遞給pycurl實例。 我只是想我會嘗試寫回讀回調,所以我可以實現「分塊」傳輸,但認爲pycurl最好是自己動手。 – maranas 2010-03-07 07:30:24

+0

@maranas,當然,如果你有能力複製那裏的數據,cStringIO會更簡單,我的代碼只適用於你無法承受的情況;-)。 – 2010-03-07 16:45:38