[英]Transfer files with Python 2.7/Pyro4 UnicodeEncodeError
因此,我試圖通過使用它創建一個簡單的文件服務器來學習Pyro。 我已經實現了一些基本功能,現在我正在嘗試添加文件傳輸。 我已經看過如何執行此操作的示例( https://github.com/irmen/Pyro4/tree/master/examples/filetransfer ),而使用純Pyro的方式似乎只是返回讀取的字節從文件中寫入到接收端。
這就是我所做的(我知道我確實應該在發送文件時分解文件,但是一旦解決此問題,我就可以這樣做):
client.py
import Pyro4
server= Pyro4.Proxy("PYRONAME:server")
def download(file_name):
output_file = open(file_name, "wb")
output_file.write(server.download(file_name))
output_file.close()
print "Downloaded file: {}".format(file_name)
server.py
import Pyro4
@Pyro4.expose
class Server(object):
def download(self, file_name):
return open(file_name, "rb").read()
daemon = Pyro4.Daemon()
ns = Pyro4.locateNS()
uri = daemon.register(Server)
ns.register("server", uri)
daemon.requestLoop()
這對於一些簡單的文件(例如某些.txt文檔)來說很好用,但是當我嘗試其他文件類型(例如.pdf)時,出現錯誤:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 11-14: ordinal no in range(128)
我花了一些時間查找此錯誤,而最接近解決方案的方法是更改client.py中的這一行:
output_file.write(server.download(file_name))
至:
output_file.write(server.download(file_name).encode("ascii", "replace"))
這樣可以避免錯誤,完成下載並提供正確大小的文件。 但是該文件已損壞且無法打開。
任何建議如何解決此問題? 如果沒有其他方法可以用Pyro進行文件傳輸?
看到這里: https : //github.com/irmen/Pyro4/blob/master/examples/filetransfer/client.py#L14
如果使用蛇,則需要特別注意正確處理序列化的字節。 該示例顯示了如何執行此操作。
使用pickle或marshal序列化程序時,將對二進制數據進行更有效的有線編碼。 此處的詳情https://pyro4.readthedocs.io/en/stable/tipstricks.html#binary-data-transfer-file-transfer
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.