繁体   English   中英

使用Python 2.7 / Pyro4 UnicodeEncodeError传输文件

[英]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进行文件传输?

这是因为file.write只能写入字节,并且还会尝试将输入字符串转换为ascii编码。 您的pdf文件使用不同的编码(也许是UTF-8)。 您可以尝试类似

fptr.write(byte_string).encode("utf-8"))

在处理文件时,我观察到相同的错误。 这是由于除了ascii之外的一些编码。 您可以参考此SO Post以获得更多信息。 有关pdf编码的更多信息,请参阅 pdf的第86页。

看到这里: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM