python 2.7 ubuntu(ubuntu安装Python3.9)
ubuntu下python2.7链接mysql
在Ubuntu系统中,使用Python 2.7链接MySQL数据库时常会遇到如下报错:
mysql_exceptions.OperationalError:(2002,"Can’t connect to local MySQL server through socket‘/var/run/mysqld/mysqld.sock’(2)")
这一问题的根源在于Python默认通过/var/run/mysqld/mysqld.sock查找MySQL的mysqld.sock文件,而Ubuntu则会在/tmp目录中生成此文件。为了解决这一问题,可以通过创建软链接来实现:
ln-s/tmp/mysql.sock/var/run/mysqld/mysqld.sock
然而,由于MySQL.sock位于/tmp目录,系统在重启后会自动删除该文件,导致软链接失效。因此,每次重启后都需要重新建立软链接。
对于希望在系统重启后不自动删除MySQL.sock文件的解决方法进行了一番探索,但并未找到有效方案。因此,通过创建软链接是解决Ubuntu下Python 2.7链接MySQL数据库问题的简便方法。简而言之,在Ubuntu系统中使用Python 2.7链接MySQL数据库时,确保MySQL.sock文件位于/var/run/mysqld目录下或创建相应软链接,是避免报错的关键步骤。
怎么在ubuntu安装python
怎么在ubuntu安装python?
python在ubuntu下有几种安装方法:
●通过ubuntu官方的apt工具包安装
●通过PPA(Personal Package Archive)的apt工具包安装
●通过编译python源代码安装
通过ubuntu官方的apt工具包安装
1
2
sudo apt-get install python2.7
sudo apt-get install python3.4
安装完成后,可以用下面的命令进行确认
1
2
3
4
5
xx@ada:~$ python2.7--version Python 2.7.8
xx@ada:~$ python3.4--version Python 3.4.2
xx@ada:~$
从PPA(Personal Package Archives)安装apt工具包
1
2
3
4
5
$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:fkrull/deadsnakes
$ sudo apt-get update
$ sudo apt-get install python2.7
类似使用apt工具包安装python的工具虽然简单,但有时不一定能够安装到最新版本。因此,在python出现重要更新时,我们最好学会以从源代码直接编译安装python2.7.
从源代码编译安装python
1
2
3
4
5
6
$ wget-c
$ tar-xzvf Python-2.7.9.tgz
$ cd Python-2.7.9/
$ LDFLAGS="-L/usr/lib/x86_64-linux-gnu"./configure
$ make
$ sudo make install
其中,上面的wget-c(url)是下载命令,参数-c表示支持断点下载, url是目标文件下载的绝对路径“-L/usr/lib/x86_64-linux-gnu”中的x86_64-linux-gnu在/usr/lib/下可以找到,这是x86_64可以看出我的系统是64的,这里根据自己的系统进行键入。
好了,安装完后我们检测下,终端键入python--version,回车,再键入which python
1
2
3
4
5
xx@ada:~$ python--version Python 2.7.9
xx@ada:~$ which python/usr/local/bin/python
xx@ada:~$
可见,python2.7.9安装成功,并且发现我们默认的python版本变成了python2.7.9。这是因为操作系统在搜索命令时,是按照PATH环境变量的顺序依次进行搜索的,/usr/local/bin/下的python会比/usr/bin/下的python优先搜索到,并作为默认的python版本。
那么我ubuntu14.10下就有三个版本的python,分别是python2.7.8, python2.7.9, python3.4.2,如下:
1
2
3
4
5
6
7
8
9
10
11
12
xx@ada:~$ python--version Python 2.7.9
xx@ada:~$ python2.7--version Python 2.7.9
xx@ada:~$ python3.4--version Python 3.4.2
xx@ada:~$ python2.7 Python 2.7.9(default, Jan 3 2015, 03:27:08) [GCC 4.9.1] on linux2 Type"help","copyright","credits" or"license" for more information.>>> exit() xx@ada:~$
当然,我们也可以指定python的路径,为查看python的版本,如下:
1
2
3
4
5
6
7
8
9
10
11
xx@ada:~$/usr/bin/python--version Python 2.7.8
xx@ada:~$/usr/bin/python2.7--version Python 2.7.8
xx@ada:~$/usr/bin/python3.4--version Python 3.4.2
xx@ada:~$/usr/local/bin/python--version Python 2.7.9
xx@ada:~$/usr/local/bin/python2.7--version Python 2.7.9
xx@ada:~$
至此,我们就已经介绍完了python在ubuntu下的三种安装方法。
Python2.7 中文字符编码,使用Unicode时,选择什么编码格式
关于编码和乱码的问题,我简单讲一下。
通常问这类问题的人是混淆了若干个不同的概念,并且他们自己也没有意识到自己混淆了这些概念的。
终端显示字符的编码(windows下终端是cmd,linux下是各种terminal,远程登录是putty或者xshell)
shell环境的编码。比如中文版windows用的是gbk(向下兼容gb2312),大多数linux发行版使用的是utf-8(LANG=zh_CN.UTF-8)。
文本文件的编码。这个通常取决于你的编辑器,而且有的编辑器支持多种编码的话,你可以在文本开头位置指定编辑器使用特定编码。比如#-*- coding: utf8-*-,vim看到这行会默认将这个脚本认定为utf-8兼容编码格式。
应用程序的内部编码。一个字符串,作为数据只是一个字节数组,但是作为字符的数组,就有一个解析方式。java和python的内部字符编码是utf-16,python和java都支持用不同的编码来对字节数组进行decode来得到字符数组。
拿题主的问题来解释一下。
我在ubuntu kylin中文环境下默认terminal中做了同样的实验,但是结果和题主恰好相反:
看见没有?
题主和我都没有说谎,这是为什么呢?
因为
unicode("汉字","gb2312")
这坨代码的含义实际上是:将这里显示的这坨看上去像“汉字”的东西,用gb2312解码,转换为unicode字符串。unicode("汉字","utf-8")类似,只不过是用utf-8解码,转成unicode字符串。
(注:这里涉及到两个概念——unicode字符集和utf-8编码——很多时候会用混淆,一个字符集表示一堆符号,而一种编码是用二进制表示这个字符集的一种编码方式。同样是unicode字符集,可以有utf-8、utf-16、utf-32等等编码方式。)
那这里显示的看上去像“汉字”的,tmd的到底是个什么东西?
如果是在我的环境下,也就是linux utf-8环境下一个utf-8显示终端,能显示成“汉字”的这坨东西,它实际上是以utf-8编码的“汉”字和“字”字两个unicode字符。它们的真实字符值就是u'\u6c49\u5b57'(内码),可以用"汉字".encode("hex")来查看当前终端下(utf-8编码值)的十六进制码。
。所以我的命令是,。所以我的命令是,将'e6b189e5ad97'这坨字节数组,转换为unicode的字符数组。——结果毫无难度,没有错误,因为它本来就是utf-8编码,所以能够正常作为unicode字符解码。
但是unicode("汉字","gb2312")就不一样了,这个命令等同于“将'e6b189e5ad97'这坨东西,用gb2312编码方式来解码成字符”,但是实际上由于编码空间并不兼容,使用gb2312编码方式无法解码这么一坨奇葩的数据,所以葛屁了。
在题主的环境下,因为系统终端和默认文件编码都是GBK,所以这个数实际上是
这个实际上是gbk(兼容gb2312)的字符“汉字”的真实字节数组。这个实际上是gbk(兼容gb2312)的字符“汉字”的真实字节数组。
所以对这坨数据做unicode("汉字","utf8")会失败——因为不管你怎么想,虽然看上去是一样,但是实际上不是同一坨东西啊!
题主现在弄了一个文件,在开始加上了
#-*- coding: utf8-*-
这下编辑器看到了,知道这文件是utf-8的了。所以编辑器对读入的一坨坨字节用utf-8来解码,对于输出到磁盘的汉字也用utf-8来编码。所以你在文件里面看到的看上去像“汉字”的东西,就和第一种情况下想同了,当然代码就跑得通。
顺便说一下,如果编辑器无视行首这行编码声明,或者编辑器无法支持utf-8格式,那么你弄好的文件在那个编辑器下就会显示乱码,多么简单的道理啊。
所以,要能够正常的显示中文(或者其他什么乱七八糟奇葩的多字节文字),以下条件缺一不可:
终端和环境的编码一致(本机通常是一致的,不一致常常出现在远程登录);如果不一致就需要有编辑器或者文本阅读器做一个兼容两者的转换。
编辑器能够认识文本编码
系统拥有能显示这种字符的字体。
这也就是我为什么一直反对在程序文本中使用除ascii之外的所有编码字符的原因。环境太复杂了,绕开问题远比解决问题轻松。