为了账号安全,请及时绑定邮箱和手机立即绑定

为什么只有在传递Python脚本的输出时才会出现unicode错误?

为什么只有在传递Python脚本的输出时才会出现unicode错误?

慕村9548890 2021-03-30 13:14:57
我使用的是2.7编写的Python脚本(seafile-cli来自Seafile,这是文件同步解决方案)。我知道unicode在Python 2中是有问题的,但值得庆幸的是,在启动脚本时正确处理了带有变音符号的文件名:$ # seaf-cli status# Name  Status  Progressphotos  downloading     0/0, 0.0KB/sMa bibliothèque downloading     566/1770, 1745.7KB/svideos  downloading     28/1203, 5088.0KB/sdev-perso       downloading     0/0, 0.0KB/sdev-pro downloading     0/0, 0.0KB/s令我惊讶的是,在传递此输出时,Python脚本崩溃UnicodeEncodeError:$ seaf-cli status | cat -# Name  Status  Progressphotos  downloading     0/0, 0.0KB/sTraceback (most recent call last):  File "/usr/bin/seaf-cli", line 845, in <module>    main()  File "/usr/bin/seaf-cli", line 841, in main    args.func(args)  File "/usr/bin/seaf-cli", line 649, in seaf_status    tx_task.rate/1024.0)UnicodeEncodeError: 'ascii' codec can't encode character u'\xe8' in position 11: ordinal not in range(128)虽然我知道它Ma bibliothèque最初可能有问题(但没有),但为什么管道传输会触发回溯?那不是外壳的问题吗?-此时输出已“离开”脚本。
查看完整描述

1 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

Python知道如何处理程序内部的编码,因为它使用了终端应用程序正在使用的任何编码。


当你发送(管道)的输出出来,它需要被编码。这是因为使用管道实际上在应用程序之间发送字节流。每个管道都是单向通道,一侧写入数据,另一侧读取数据。


使用管道或重定向,您正在将数据发送到fd,该数据由另一个应用程序读取。


因此,您需要确保Python在将数据发送出去之前正确地对数据进行编码,然后输入程序需要在处理之前对其进行解码。


您可能还会发现此问题有用


更新:我将尝试详细说明编码。我的答案的第一行是什么意思,因为您的Python解释器使用特定的编码,所以它知道如何将六进制值(实际字节)转换为符号。


我的翻译没有;如果我尝试从您的文本创建字符串-我收到错误消息:


>>> s = 'bibliothèque'

Unsupported characters in input

这是因为我在解释器上使用了不同的编码。


您的外壳使用与Python解释器不同的编码。当Python从程序中发送数据时,它使用默认编码:ASCII。它无法使用ASCII转换您的特殊字符(由十六进制值\ xe8显示)。因此,您必须指定要使用的编码,以便Python发送。



查看完整回答
反对 回复 2021-04-09
  • 1 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信