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

我使用的是2.7编写的Python脚本(seafile-cli来自Seafile,这是文件同步解决方案)。


我知道unicode在Python 2中是有问题的,但值得庆幸的是,在启动脚本时正确处理了带有变音符号的文件名:


$ # seaf-cli status

# Name  Status  Progress

photos  downloading     0/0, 0.0KB/s

Ma bibliothèque downloading     566/1770, 1745.7KB/s

videos  downloading     28/1203, 5088.0KB/s

dev-perso       downloading     0/0, 0.0KB/s

dev-pro downloading     0/0, 0.0KB/s

令我惊讶的是,在传递此输出时,Python脚本崩溃UnicodeEncodeError:


$ seaf-cli status | cat -

# Name  Status  Progress

photos  downloading     0/0, 0.0KB/s

Traceback (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最初可能有问题(但没有),但为什么管道传输会触发回溯?


那不是外壳的问题吗?-此时输出已“离开”脚本。


慕村9548890
浏览 177回答 1
1回答

互换的青春

Python知道如何处理程序内部的编码,因为它使用了终端应用程序正在使用的任何编码。当你发送(管道)的输出出来,它需要被编码。这是因为使用管道实际上在应用程序之间发送字节流。每个管道都是单向通道,一侧写入数据,另一侧读取数据。使用管道或重定向,您正在将数据发送到fd,该数据由另一个应用程序读取。因此,您需要确保Python在将数据发送出去之前正确地对数据进行编码,然后输入程序需要在处理之前对其进行解码。您可能还会发现此问题有用更新:我将尝试详细说明编码。我的答案的第一行是什么意思,因为您的Python解释器使用特定的编码,所以它知道如何将六进制值(实际字节)转换为符号。我的翻译没有;如果我尝试从您的文本创建字符串-我收到错误消息:>>> s = 'bibliothèque'Unsupported characters in input这是因为我在解释器上使用了不同的编码。您的外壳使用与Python解释器不同的编码。当Python从程序中发送数据时,它使用默认编码:ASCII。它无法使用ASCII转换您的特殊字符(由十六进制值\ xe8显示)。因此,您必须指定要使用的编码,以便Python发送。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python