Python 从OS X执行ssh时出现UnicodeDecodeError
我的Django应用程序在启动时(或当我执行管理命令时)加载一些文件。当我从我的一台Arch或Ubuntu机器上ssh运行正常时,我能够成功地运行任何命令和迁移 但当我从OS X(我有El Capital)ssh并尝试执行相同的操作时,我会出现以下错误:Python 从OS X执行ssh时出现UnicodeDecodeError,python,django,macos,ssh,locale,Python,Django,Macos,Ssh,Locale,我的Django应用程序在启动时(或当我执行管理命令时)加载一些文件。当我从我的一台Arch或Ubuntu机器上ssh运行正常时,我能够成功地运行任何命令和迁移 但当我从OS X(我有El Capital)ssh并尝试执行相同的操作时,我会出现以下错误: UnicodeDecodeError: 'ASCII' codec can't decode byte 0xc3 in position 0: ordinal not in range(128) 要打开我的文件,我使用带有open(路径到文件
UnicodeDecodeError: 'ASCII' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
要打开我的文件,我使用带有open(路径到文件)的作为f:…
从iterm和terminal进行sshing时发生错误。我发现原因是环境变量。它没有在我的其他Linux机器上设置,但在mac上它是UTF-8
,所以在我ssh到服务器之后,它被设置为相同的。在我取消设置LC\u CTYPE
后,错误被修复
因此,实际问题是发生了什么,以及如何进一步避免这种情况?我可以在我的本地机器中取消设置这个变量,但它会带来一些负面影响吗?最好的方法是什么?本地机器上的终端使用字符编码。它使用的编码似乎是UTF-8。当你登录到你的服务器时(顺便说一句,它运行什么操作系统?),在那里运行的程序需要知道你的终端支持什么编码,以便它们根据需要显示内容。他们从
LC\u CTYPE
获取此信息ssh
正确地将其设置为UTF-8,因为您的终端支持UTF-8
取消设置LC\u CTYPE
时,程序将使用默认的ASCII
。程序现在以ASCII
显示,而不是UTF-8
,这是因为UTF-8
与ASCII
向后兼容。但是,如果程序需要显示ASCII中不存在的特殊字符,它将无法工作
尽管从您提供的信息来看,我并不完全清楚系统为何会以这种方式运行,但我可以告诉您,取消设置LC\u CTYPE
是一种糟糕的解决方法。为了避免将来出现问题,最好确保所有机器中的所有终端都使用UTF-8,并去掉ASCII
当您尝试
打开
文件时,Python使用终端的(即LC_CTYPE
)字符集。我一直不太明白为什么会这样;为什么终端的字符集应该指示文件的编码?但是,这就是它的制作方法,正确解决问题的方法是,如果您使用的是Python 3,则使用open
的编码
参数,如果您使用的是Python 2,则使用编解码器
标准库模块。更新OS-X后,我遇到了类似的问题,由于未正确设置UTF-8区域设置,因此未对UNIX服务器上的版权字符进行编码。我解决了在终端首选项中取消选中设置“启动时设置语言环境变量”的问题.事实上,我只是在谷歌上搜索到UTF-8
不是有效的LC\u CTYPE,所以我将export LC\u ALL=en\u US.UTF-8
和export LANG=en\u US.UTF-8
添加到我的bash\u配置文件中,解决了这个问题。顺便说一句,我使用Ubuntu 16.04作为服务器。我不知道open使用LC_CTYPE来定义文件编码,这确实很奇怪。谢谢你。我接受你的回答。