[英]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.