我使用的是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发送。
添加回答
举报
0/150
提交
取消