unix 在Linux命令的输出中使用了什么编码,如find,从Python访问?

qvtsj1bj  于 2023-04-29  发布在  Unix
关注(0)|答案(2)|浏览(166)

Python提供了一个subprocess导入,允许对进程进行细粒度控制,但是当我在Unix中创建一个进程时,比如find,这些标准Gnu命令的输出编码是什么?

import subprocess
myProcess = subprocess.Popen(shlex.split('find ./dir -mindepth 1 -maxdepth 1 -type f -mtime +14'), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
outputs = myProcess.communicate()
myStdout = outputs[0].read()
myStderr = outputs[1].read()
print(myStdout.decode('utf-8/ascii')) # ???

我猜你可以通过任何一种解码来逃脱,但是正式地说,我应该如何解释所有标准Unix命令的输出“将文本输出到控制台”?

pxy2qtax

pxy2qtax1#

编码不是固定的,取决于用户的语言环境。它通常是UTF-8,这是大多数现代发行版的默认设置,但同样-用户可以改变这一点。
您可以在本地终端中检查当前的编码

$ locale charmap

要从Python中获得它,您可以使用locale。getpreferredencoding():

import locale

...

encoding = locale.getpreferredencoding()
print(myStdout.decode(encoding))
o0lyfsai

o0lyfsai2#

这取决于几个因素。
第一个因素是关于你正在运行的程序:它有一个固定编码(或者你可以设置它,例如:例如在命令行中)。通常系统程序知道编码,但许多简单和肮脏的程序可能会忽略所有的编码。
第二个因素:区域设置编码(如系统所知)。该编码可以通过环境变量(例如例如LANG_ALLLC_*),或系统默认值,通常为C(因此ASCII编码和英语)。注意:新用户的默认编码是不同的(它只是在正确的位置设置了如上所述的环境变量)。
但是注意:终端/控制台必须能够解释编码。如果您将UTF-8字符串发送到只能使用8位字体的终端,您将看不到UTF-8文本(尽管该字符串可能是UTF-8)

相关问题