Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 尝试将命令行输出保存到文件时出错_Python_Linux_Unicode_Command Line_Pipe - Fatal编程技术网

Python 尝试将命令行输出保存到文件时出错

Python 尝试将命令行输出保存到文件时出错,python,linux,unicode,command-line,pipe,Python,Linux,Unicode,Command Line,Pipe,我正在运行一个python工具,并试图将其输出保存到一个文件中。如果我不将输出保存到文件中,该工具运行得非常好。但当我试图将输出保存到文件时,它会抛出以下错误并中断程序: File "./androdiff.py", line 118, in <module> main(options, arguments) File "./androdiff.py", line 94, in main ddm.show() File "./elsim/elsim/elsim_dalvi

我正在运行一个python工具,并试图将其输出保存到一个文件中。如果我不将输出保存到文件中,该工具运行得非常好。但当我试图将输出保存到文件时,它会抛出以下错误并中断程序:

  File "./androdiff.py", line 118, in <module>
main(options, arguments)
  File "./androdiff.py", line 94, in main
ddm.show()
  File "./elsim/elsim/elsim_dalvik.py", line 772, in show
self.eld.show()
  File "./elsim/elsim/elsim.py", line 435, in show
i.show()
  File "./elsim/elsim/elsim_dalvik.py", line 688, in show
  print hex(self.bb.bb.start + self.offset), self.pos_instruction, self.ins.get_name(), self.ins.show_buff( self.bb.bb.start + self.offset )
  UnicodeEncodeError: 'ascii' codec can't encode character u'\u0111' in position 35: ordinal not in range(128)
文件“/androdiff.py”,第118行,在
主(选项、参数)
文件“/androdiff.py”,第94行,主
ddm.show()
文件“/elsim/elsim/elsim_dalvik.py”,第772行,在show中
self.eld.show()
文件“/elsim/elsim/elsim.py”,第435行,在show中
i、 show()
文件“/elsim/elsim/elsim_dalvik.py”,第688行,在show中
打印十六进制(self.bb.bb.start+self.offset)、self.pos\u指令、self.ins.get\u name()、self.ins.show\u buff(self.bb.bb.start+self.offset)
UnicodeEncodeError:“ascii”编解码器无法对位置35处的字符u'\u0111'进行编码:序号不在范围内(128)
我试过
command | less
command>output
command | tee output
,它们都会抛出这样的错误

请帮助解决这个问题


谢谢

在打印字符串之前,您需要指定字符串的编码:

print unicode(hex(self.bb.bb.start + self.offset)).encode('utf-8')
print unicode(self.pos_instruction, self.ins.get_name()).encode('utf-8')
print unicode(self.ins.show_buff( self.bb.bb.start + self.offset )).encode('utf-8')
之所以这样做,是因为python在打印到终端时(它检测到终端使用utf-8)会自动正确编码字符串(在您的例子中是utf-8)

当您将输出重定向到一个文件时,Python没有关于应该使用什么编码的信息,而是默认为ascii(这导致了您的错误)

一般的经验法则是,确保在打印前始终对字符串进行编码,以使
打印
在所有环境下都能正常工作

最好的方法可能是为此定义自己的打印方法:

def myprint(unicodestr): 
    print unicodestr.encode('utf-8')
如果您希望避免上述情况,并将utf-8编码作为默认的打印方式,您可以这样做

import sys
import codecs
sys.stdout=codecs.getwriter('utf-8')(sys.stdout)

小心这种方法!某些第三方库可能依赖于默认编码ascii和break。请注意,Python 3(默认为UTF-8编码)解决了整个混乱问题。

在打印字符串之前,您需要指定字符串的编码:

print unicode(hex(self.bb.bb.start + self.offset)).encode('utf-8')
print unicode(self.pos_instruction, self.ins.get_name()).encode('utf-8')
print unicode(self.ins.show_buff( self.bb.bb.start + self.offset )).encode('utf-8')
之所以这样做,是因为python在打印到终端时(它检测到终端使用utf-8)会自动正确编码字符串(在您的例子中是utf-8)

当您将输出重定向到一个文件时,Python没有关于应该使用什么编码的信息,而是默认为ascii(这导致了您的错误)

一般的经验法则是,确保在打印前始终对字符串进行编码,以使
打印
在所有环境下都能正常工作

最好的方法可能是为此定义自己的打印方法:

def myprint(unicodestr): 
    print unicodestr.encode('utf-8')
如果您希望避免上述情况,并将utf-8编码作为默认的打印方式,您可以这样做

import sys
import codecs
sys.stdout=codecs.getwriter('utf-8')(sys.stdout)

小心这种方法!某些第三方库可能依赖于默认编码ascii和break。请注意,在Python 3(默认为UTF-8编码)中,如果无法自动确定标准字符编码(例如,当输出重定向到文件时),则已显式设置
PYTHONIOENCODING
环境变量,从而解决了整个混乱问题:

$ PYTHONIOENCODING=utf-8 python app.py > file

如果输出可能进入终端,不要硬编码脚本中的字符编码;改为打印Unicode字符串,并让用户配置其环境。

如果无法自动确定标准字符编码(例如,当输出重定向到文件时),请显式设置
PYTHONIOENCODING
环境变量:

$ PYTHONIOENCODING=utf-8 python app.py > file

如果输出可能进入终端,不要硬编码脚本中的字符编码;改为打印Unicode字符串,让用户配置他们的环境。

当您“保存到文件”时,是否重定向
stdout
?像这样
python app.py>文件
?是的。这就是我在“保存到文件”时使用的方法。您是否正在重定向标准输出?像这样
python app.py>文件
?是的。这就是我用的谢谢!马丁。我是否可以将默认值从ascii更改为utf-8,而不是每次调用
print
?工具中有很多地方都在使用
print
,我不必费心重构它们中的每一个。您不应该在脚本中硬编码用户的终端字符编码。你可以用。谢谢!马丁。我是否可以将默认值从ascii更改为utf-8,而不是每次调用
print
?工具中有很多地方都在使用
print
,我不必费心重构它们中的每一个。您不应该在脚本中硬编码用户的终端字符编码。您可以使用。这是我所需要的-终端的输出正常,对于小的输出,我可以复制粘贴正确。变量名不是很方便,但它可以节省时间。我需要检查这是否适用于
os.environ
。好的。这就是我所需要的——终端输出正常,对于小的输出,我可以复制粘贴正确。变量名不是很方便,但它可以节省时间。我需要检查这是否适用于
os.environ
。好的,是的。