- linux CPU大小
cat /proc/cpuinfo |grep “model name” && cat /proc/cpuinfo |grep “physical id”
说明:Linux下可以在/proc/cpuinfo中看到每个cpu的详细信息。但是对于双核的cpu,在cpuinfo中会看到两个cpu。常常会让人误以为是两个单核的cpu。其实应该通过Physical Processor ID来区分单核和双核。而Physical Processor ID可以从cpuinfo或者dmesg中找到. flags 如果有 ht 说明支持超线程技术 判断物理CPU的个数可以查看physical id 的值 - cat /proc/meminfo |grep MemTotal # 内存大小
- fdisk -l |grep Disk # 硬盘大小
- uname -a # 查看内核/操作系统/CPU信息的linux系统信息命令
- head -n 1 /etc/issue # 查看操作系统版本,是数字1不是字母L
- cat /proc/cpuinfo # 查看CPU信息的linux系统信息命令
- hostname # 查看计算机名的linux系统信息命令
- lspci -tv # 列出所有PCI设备
- lsusb -tv # 列出所有USB设备的linux系统信息命令
- lsmod # 列出加载的内核模块
- env # 查看环境变量资源
- free -m # 查看内存使用量和交换区使用量
- df -h # 查看各分区使用情况
- du -sh # 查看指定目录的大小
- grep MemTotal /proc/meminfo # 查看内存总量
- grep MemFree /proc/meminfo # 查看空闲内存量
- uptime # 查看系统运行时间、用户数、负载
- cat /proc/loadavg # 查看系统负载磁盘和分区
- mount | column -t # 查看挂接的分区状态
- fdisk -l # 查看所有分区
- swapon -s # 查看所有交换分区
- hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
- dmesg | grep IDE # 查看启动时IDE设备检测状况网络
- ifconfig # 查看所有网络接口的属性
- iptables -L # 查看防火墙设置
- route -n # 查看路由表
- netstat -lntp # 查看所有监听端口
- netstat -antp # 查看所有已经建立的连接
- netstat -s # 查看网络统计信息进程
- ps -ef # 查看所有进程
- top # 实时显示进程状态用户
- w # 查看活动用户
- id # 查看指定用户信息
- last # 查看用户登录日志
- cut -d: -f1 /etc/passwd # 查看系统所有用户
- cut -d: -f1 /etc/group # 查看系统所有组
- crontab -l # 查看当前用户的计划任务服务
- chkconfig –list # 列出所有系统服务
- chkconfig –list | grep on # 列出所有启动的系统服务程序
- rpm -qa # 查看所有安装的软件包
- cat /proc/cpuinfo # 查看CPU相关参数的linux系统命令
- cat /proc/partitions # 查看linux硬盘和分区信息的系统信息命令
- cat /proc/meminfo :查看linux系统内存信息的linux系统命令
- cat /proc/version # 查看版本,类似uname -r
- cat /proc/ioports # 查看设备io端口
- cat /proc/interrupts # 查看中断
- cat /proc/pci # 查看pci设备的信息
- cat /proc/swaps # 查看所有swap分区的信息
- uname 显示版本信息(同win2K的 ver)
- dir 显示当前目录文件,ls -al 显示包括隐藏文件(同win2K的 dir)
- pwd 查询当前所在的目录位置
- cd cd ..回到上一层目录,注意cd 与..之间有空格。cd /返回到根目录。
- cat 文件名 查看文件内容
- cat >abc.txt 往abc.txt文件中写上内容。
- more 文件名 以一页一页的方式显示一个文本文件。
- cp 复制文件
- mv 移动文件
- rm 文件名 删除文件,rm -rf 目录名删除目录及子目录
- mkdir 目录名 建立目录
- rmdir 删除子目录,目录内没有文档。
- chmod 设定档案或目录的存取权限
- grep 在档案中查找字符串
- diff 档案文件比较
- find 档案搜寻
- date 现在的日期、时间
- who 查询目前和你使用同一台机器的人以及Login时间地点
- w 查询目前上机者的详细资料
- whoami 查看自己的帐号名称
- groups 查看某人的Group
- passwd 更改密码
- history 查看自己下过的命令
- ps 显示进程状态
- kill 停止某进程
- gcc 黑客通常用它来编译C语言写的文件
- su 权限转换为指定使用者
- telnet IP telnet连接对方主机(同win2K),当出现bash$时就说明连接成功。
- ftp ftp连接上某服务器(同win2K)
Category Archives: 程序开发
Python MySQL使用持久连接
python连接mysql中没有长连接的概念,但我们可以利用mysql的ping机制,来实现长连接功能~
思路:
1 python mysql 的cping 函数会校验连接的可用性,如果连接不可用将会产生异常
2 利用这一特性,构造一个连接丢失的循环,不断尝试连接数据库,直到连接恢复
3 使用这样的机制不需要关闭数据库功能,对于驻留进程,有大量数据进行写操作时,很有用途
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
#!/usr/bin/env python # -*-coding:UTF-8-*- import sys,MySQLdb,traceback import time class mysql: def __init__ (self, host = '', user = '', passwd = '', db = '', port = 3306, charset= 'utf8' ): self.host = host self.user = user self.passwd = passwd self.db = db self.port = port self.charset= charset self.conn = None self._conn() def _conn (self): try: self.conn = MySQLdb.Connection(self.host, self.user, self.passwd, self.db, self.port , self.charset) return True except : return False def _reConn (self,num = 28800,stime = 3): #重试连接总次数为1天,这里根据实际情况自己设置,如果服务器宕机1天都没发现就...... _number = 0 _status = True while _status and _number <= num: try: self.conn.ping() #cping 校验连接是否异常 _status = False except: if self._conn()==True: #重新连接,成功退出 _status = False break _number +=1 time.sleep(stime) #连接不成功,休眠3秒钟,继续循环,知道成功或重试次数结束 def select (self, sql = ''): try: self._reConn() self.cursor = self.conn.cursor(MySQLdb.cursors.DictCursor) self.cursor.execute (sql) result = self.cursor.fetchall() self.cursor.close () return result except MySQLdb.Error,e: #print "Error %d: %s" % (e.args[0], e.args[1]) return False def select_limit (self, sql ='',offset = 0, length = 20): sql = '%s limit %d , %d ;' % (sql, offset, length) return self.select(sql) def query (self, sql = ''): try: self._reConn() self.cursor = self.conn.cursor(MySQLdb.cursors.DictCursor) self.cursor.execute ("set names utf8") #utf8 字符集 result = self.cursor.execute (sql) self.conn.commit() self.cursor.close () return (True,result) except MySQLdb.Error, e: return False def close (self): self.conn.close() if __name__=='__main__': my = mysql('localhost','root','password','database',3306) print my.select_limit('select * from sdb_admin_roles',1,1) #my.close() |
python MySQLdb中cursor操作数据库
python 操作数据库,要安装一个Python和MySQLdb,这样就可以进行数据库操作了。
操作步骤如下:
1、建立数据库连接
import MySQLdb
conn=MySQLdb.connect(host=”localhost”,user=”root”,passwd=”sa”,db=”mytable”)
cursor=conn.cursor()
2、执行数据库操作
n=cursor.execute(sql,param)
我们要使用连接对象获得一个cursor对象,接下来,我们会使用cursor提供的方法来进行工作.
这些方法包括两大类:1.执行命令,2.接收返回值
3、cursor用来执行命令的方法:
callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
executemany(self, query, args):执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
nextset(self):移动到下一个结果集
4、cursor用来接收返回值的方法:
fetchall(self):接收全部的返回结果行.
fetchmany(self, size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.
fetchone(self):返回一条结果行.
scroll(self, value, mode=’relative’):移动指针到某一行.如果mode=’relative’,则表示从当前所在行移动value条,如果mode=’absolute’,则表示从结果集的第一 行移动value条.
5、下面的代码是一个完整的例子.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#使用sql语句,这里要接收的参数都用%s占位符.要注意的是,无论你要插入的数据是什么类型,占位符永远都要用%s sql="insert into cdinfo values(%s,%s,%s,%s,%s)" #param应该为tuple或者list param=(title,singer,imgurl,url,alpha) #执行,如果成功,n的值为1 n=cursor.execute(sql,param) #再来执行一个查询的操作 cursor.execute("select * from cdinfo") #我们使用了fetchall这个方法.这样,cds里保存的将会是查询返回的全部结果.每条结果都是一个tuple类型的数据,这些tuple组成了一个tuple cds=cursor.fetchall() #因为是tuple,所以可以这样使用结果集 print cds[0][3] #或者直接显示出来,看看结果集的真实样子 print cds #如果需要批量的插入数据,就这样做 sql="insert into cdinfo values(0,%s,%s,%s,%s,%s)" #每个值的集合为一个tuple,整个参数集组成一个tuple,或者list param=((title,singer,imgurl,url,alpha),(title2,singer2,imgurl2,url2,alpha2)) #使用executemany方法来批量的插入数据.这真是一个很酷的方法! n=cursor.executemany(sql,param) |
需要注意的是(或者说是我感到奇怪的是),在执行完插入或删除或修改操作后,需要调用一下conn.commit()方法进行提交.这样,数据才会真正保 存在数据库中.如果不用commit,那数据就不会保留在数据库中,但是,数据 确实在数据库呆过.因为自动编号进行了累积,而且返回的受影响的行数并不为0.
6、关闭数据库连接
需要分别的关闭指针对象和连接对象.他们有名字相同的方法
cursor.close()
conn.close()
Django操作数据库
django是一个出色的用于python的web框架。django连接有操作数据库的api,使用起来十分简洁。我们在settings.py中配置好所要连接的数据库,然后在modules、view、urls中分别写好业务逻辑
命令行运行Python脚本时传入参数的三种方式
如果在运行python脚本时需要传入一些参数,例如gpus
与batch_size
,可以使用如下三种方式。
0 1 2 |
python script.py 0,1,2 10 python script.py -gpus=0,1,2 --batch-size=10 python script.py -gpus=0,1,2 --batch_size=10 |
这三种格式对应不同的参数解析方式,分别为sys.argv
, argparse
, tf.app.run
, 前两者是python自带的功能,后者是tensorflow
提供的便捷方式。
sys.argv
sys
模块是很常用的模块, 它封装了与python解释器相关的数据,例如sys.modules
里面有已经加载了的所有模块信息,sys.path
里面是PYTHONPATH
的内容,而sys.argv
则封装了传入的参数数据。
使用sys.argv
接收上面第一个命令中包含的参数方式如下:
0 1 2 3 4 5 |
import sys gpus = sys.argv[1] #gpus = [int(gpus.split(','))] batch_size = sys.argv[2] print gpus print batch_size |
需要模块:sys
参数个数:len(sys.argv)
脚本名: sys.argv[0]
参数1: sys.argv[1]
参数2: sys.argv[2]
test.py
0 1 2 3 4 5 |
import sys print "脚本名:", sys.argv[0] for i in range(1, len(sys.argv)): print "参数", i, sys.argv[i] >>>python test.py hello world |
脚本名:test.py
参数 1 hello
参数 2 world
python中使用命令行选项:
例如我们需要一个convert.py脚本。它的作用是处理一个文件,并将处理后的结果输出到另一个文件中。
要求该脚本满足以下条件:
1.通过-i -o选项来区别参数是输入文件还是输出文件.
>>> python convert.py -i inputfile -o outputfile
2.当不知道convert.py需要哪些参数时,用-h打印出帮助信息
>>> python convert.py -h
getopt函数原形:
getopt.getopt(args, options[, long_options])
convert.py
0 1 2 3 4 5 6 7 8 9 10 11 12 |
import sys, getopt opts, args = getopt.getopt(sys.argv[1:], "hi:o:") input_file="" output_file="" for op, value in opts: if op == "-i": input_file = value elif op == "-o": output_file = value elif op == "-h": usage() sys.exit() |
代码解释:
a) sys.argv[1:]为要处理的参数列表,sys.argv[0]为脚本名,所以用sys.argv[1:]过滤掉脚本名。
b) ”hi:o:”: 当一个选项只是表示开关状态时,即后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一个”:”号。所以”hi:o:”就表示”h”是一个开关选项;”i:”和”o:”则表示后面应该带一个参数。
c) 调用getopt函数。函数返回两个列表:opts和args。opts为分析出的格式信息。args为不属于格式信息的剩余的命令行参数。opts是一个两元组的列表。每个元素为:(选项串,附加参数)。如果没有附加参数则为空串”。
getopt函数的第三个参数[, long_options]为可选的长选项参数,上面例子中的都为短选项(如-i -o)
长选项格式举例:
--version
--file=error.txt
让一个脚本同时支持短选项和长选项
getopt.getopt(sys.argv[1:], "hi:o:", ["version", "file="]) Continue reading
python的日志模块logging
1.简单的将日志打印到屏幕
0 1 2 3 4 |
import logging logging.debug('This is debug message') logging.info('This is info message') logging.warning('This is warning message') |
屏幕上打印:
WARNING:root:This is warning message
默认情况下,logging将日志打印到屏幕,日志级别为WARNING;
日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别。
2.通过logging.basicConfig函数对日志的输出格式及方式做相关配置
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='myapp.log', filemode='w') logging.debug('This is debug message') logging.info('This is info message') logging.warning('This is warning message') ./myapp.log文件中内容为: Sun, 24 May 2009 21:48:54 demo2.py[line:11] DEBUG This is debug message Sun, 24 May 2009 21:48:54 demo2.py[line:12] INFO This is info message Sun, 24 May 2009 21:48:54 demo2.py[line:13] WARNING This is warning message |
logging.basicConfig函数各参数:
filename: 指定日志文件名
filemode: 和file函数意义相同,指定日志文件的打开模式,’w'或’a’
format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略
3.将日志同时输出到文件和屏幕
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='myapp.log', filemode='w') ################################################################################################# #定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,并将其添加到当前的日志处理对象# console = logging.StreamHandler() console.setLevel(logging.INFO) formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') console.setFormatter(formatter) logging.getLogger('').addHandler(console) ################################################################################################# logging.debug('This is debug message') logging.info('This is info message') logging.warning('This is warning message') 屏幕上打印: root : INFO This is info message root : WARNING This is warning message ./myapp.log文件中内容为: Sun, 24 May 2009 21:48:54 demo2.py[line:11] DEBUG This is debug message Sun, 24 May 2009 21:48:54 demo2.py[line:12] INFO This is info message Sun, 24 May 2009 21:48:54 demo2.py[line:13] WARNING This is warning message |
4.logging之日志回滚
0 1 2 3 4 5 6 7 8 9 10 |
import logging from logging.handlers import RotatingFileHandler ################################################################################################# #定义一个RotatingFileHandler,最多备份5个日志文件,每个日志文件最大10M Rthandler = RotatingFileHandler('myapp.log', maxBytes=10*1024*1024,backupCount=5) Rthandler.setLevel(logging.INFO) formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') Rthandler.setFormatter(formatter) logging.getLogger('').addHandler(Rthandler) ################################################################################################ |
从上例和本例可以看出,logging有一个日志处理的主对象,其它处理方式都是通过addHandler添加进去的。
logging的几种handle方式如下:
0 1 2 3 4 5 6 7 8 9 10 11 12 |
logging.StreamHandler: 日志输出到流,可以是sys.stderr、sys.stdout或者文件 logging.FileHandler: 日志输出到文件 日志回滚方式,实际使用时用RotatingFileHandler和TimedRotatingFileHandler logging.handlers.BaseRotatingHandler logging.handlers.RotatingFileHandler logging.handlers.TimedRotatingFileHandler logging.handlers.SocketHandler: 远程输出日志到TCP/IP sockets logging.handlers.DatagramHandler: 远程输出日志到UDP sockets logging.handlers.SMTPHandler: 远程输出日志到邮件地址 logging.handlers.SysLogHandler: 日志输出到syslog logging.handlers.NTEventLogHandler: 远程输出日志到Windows NT/2000/XP的事件日志 logging.handlers.MemoryHandler: 日志输出到内存中的制定buffer logging.handlers.HTTPHandler: 通过"GET"或"POST"远程输出到HTTP服务器 |
由于StreamHandler和FileHandler是常用的日志处理方式,所以直接包含在logging模块中,而其他方式则包含在logging.handlers模块中,
上述其它处理方式的使用请参见python2.5手册!
5.通过logging.config模块配置日志
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#logger.conf ############################################### [loggers] keys=root,example01,example02 [logger_root] level=DEBUG handlers=hand01,hand02 [logger_example01] handlers=hand01,hand02 qualname=example01 propagate=0 [logger_example02] handlers=hand01,hand03 qualname=example02 propagate=0 ############################################### [handlers] keys=hand01,hand02,hand03 [handler_hand01] class=StreamHandler level=INFO formatter=form02 args=(sys.stderr,) [handler_hand02] class=FileHandler level=DEBUG formatter=form01 args=('myapp.log', 'a') [handler_hand03] class=handlers.RotatingFileHandler level=INFO formatter=form02 args=('myapp.log', 'a', 10*1024*1024, 5) ############################################### [formatters] keys=form01,form02 [formatter_form01] format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s datefmt=%a, %d %b %Y %H:%M:%S [formatter_form02] format=%(name)-12s: %(levelname)-8s %(message)s datefmt= |
上例3:
0 1 2 3 4 5 6 7 8 |
import logging import logging.config logging.config.fileConfig("logger.conf") logger = logging.getLogger("example01") logger.debug('This is debug message') logger.info('This is info message') logger.warning('This is warning message') |
上例4:
0 1 2 3 4 5 6 7 8 |
import logging import logging.config logging.config.fileConfig("logger.conf") logger = logging.getLogger("example02") logger.debug('This is debug message') logger.info('This is info message') logger.warning('This is warning message') |
CentOS设置服务开机启动的两种方法
1、利用 chkconfig 来配置启动级别
在CentOS或者RedHat其他系统下,如果是后面安装的服务,如httpd、mysqld、postfix等,安装后系统默认不会自动启动的。就算手动执行 /etc/init.d/mysqld start 启动了服务,只要服务器重启后,系统仍然不会自动启动服务。 在这个时候,我们就需要在安装后做个设置,让系统自动启动这些服务,避免不必要的损失和麻烦。 其实命令很简单的,使用chkconfig即可。
比如要将mysqld设置为开机自动启动:
# chkconfig mysqld on
要取消掉某个服务自动启动,只需要将最后的参数 “on” 变更为 “off” 即可。
比如要取消 postfix 的自动启动:
# chkconfig postfix off
值得注意的是,如果这个服务尚未被添加到 chkconfig 列表中,则现需要使用 –-add 参数将其添加进去:
# chkconfig –-add postfix
如果要查询当前所有自动启动的服务,可以输入:
# chkconfig -–list
如果只想看指定的服务,只需要在 “–-list” 之后加上服务名就好了,比如查看httpd服务是否为自动启动:
# chkconfig –-list httpd
httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
此时0~6均为off,则说明httpd服务不会在系统启动的时候自动启动。我们输入:
# chkconfig httpd on
则此时为:
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
这个时候2~5都是on,就表明会自动启动了。
2、修改 /etc/rc.d/rc.local 这个文件:
例如将 apache、mysql、samba、svn 等这些服务的开机自启动问题一起搞定:
# vim /etc/rc.d/rc.local
#添加以下命令
/usr/sbin/apachectl start
/etc/rc.d/init.d/mysqld start
/etc/rc.d/init.d/smb start
# -d 表示svnserve将会作为一个服务程序运行在后台
/usr/local/subversion/bin/svnserve -d
centos中crontab(计时器)定时任务用法详解
关于crontab:
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρ?νο?),原意是时间。
通常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。
安装crontab:
0 1 |
[root@CentOS ~]# yum install vixie-cron [root@CentOS ~]# yum install crontabs |
说明:
vixie-cron软件包是cron的主程序;
crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。
cron 是linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:
0 1 2 3 |
/sbin/service crond start #启动服务 /sbin/service crond stop #关闭服务 /sbin/service crond restart #重启服务 /sbin/service crond reload #重新载入配置 |
查看crontab服务状态:
0 |
service crond status |
手动启动crontab服务:
0 |
service crond start |
其他命令: Continue reading
更改vim默认的 “换行缩进值”
CentOS如何更改vim缩进,默认的 “换行缩进值”
找到/etc/vimrc文件在文件,用vim将其打开,在此文件开头加上如下
1)设置(软)制表符宽度为4
set tabstop=4
set softtabstop=4
2)设置缩进的空格数为4
set shiftwidth=4
3)设置自动缩进:即每行的缩进值与上一行相等;使用 noautoindent 取消设置:
set autoindent
4)设置使用 C/C++ 语言的自动缩进方式:
set cindent
5)设置C/C++语言的具体缩进方式(以我的windows风格为例):
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
6)如果想在左侧显示文本的行号,可以用以下语句:
set nunber
在此文件尾部加入如下信息:
最后,如果没有下列语句,就加上吧:
if &term==”xterm”
set t_Co=8
set t_Sb=^[[4%dm
set t_Sf=^[[3%dm
endif
还有中文显示问题,
可以添加:
let &termencoding=&encoding
set fileencodings=utf-8,gbk,ucs-bom,cp936
上面这两行命令即可
修改vi显示行号或vim显示行号的请到这里
vim打开多个文件、同时显示多个文件、在文件之间切换(使用远程工具时同样可用)
远程工具MobaXterm
打开多个文件:
1.vim还没有启动的时候:
输入
vim file1 file2 … filen便可以打开所有想要打开的文件
2.vim已经启动
输入
:open
可以再打开一个文件,并且此时vim里会显示出file文件的内容。
分屏显示多个文件:
:split
:vsplit
:sp
:vsp
在文件之间切换:
1.文件间切换
Ctrl+6—下一个文件
:bn—下一个文件
:bp—上一个文件
对于用(v)split在多个窗格中打开的文件,这种方法只会在当前窗格中切换不同的文件。
2.在窗格间切换的方法
Ctrl+w+方向键——切换到前/下/上/后一个窗格
Ctrl+w+h/j/k/l ——同上
Ctrl+ww——依次向后切换到下一个窗格中
MySQLdb ImportError: libmysqlclient.so.18解决方法
ImportError: libmysqlclient.so.18: cannot open shared object file: No such file or directory
初装系统,运行制作完成的python项目,出现上面提示信息,说明缺少文件libmysqlclient.so.18,解决方案:
1、全局搜索libmysqlclient.so.18
# find / -name libmysqlclient.so.18
结果为:/www/wdlinux/mysql-5.5.58/lib/libmysqlclient.so.18
2、做软连接
32位系统
# ln -s /www/wdlinux/mysql-5.5.58/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18
64位系统
# ln -s /www/wdlinux/mysql-5.5.58/lib/libmysqlclient.so.18 /usr/lib64/libmysqlclient.so.18
3、测试是否成功
# python
# import MySQLdb
#
如果这里不报错,则说明问题解决。