Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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 从OS X执行ssh时出现UnicodeDecodeError_Python_Django_Macos_Ssh_Locale - Fatal编程技术网

Python 从OS X执行ssh时出现UnicodeDecodeError

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(路径到文件

我的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(路径到文件)的
作为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来定义文件编码,这确实很奇怪。谢谢你。我接受你的回答。