Category: Python

  • django开发小记

    最近尝试用django开发一个叫做vmm的虚拟机管理网站。以下是我在第一次使用django开发较完整网站时学到的东西。 TIME_ZONE 首先是发现django在显示datetime时与预期不太一样,比如下午2点时页面上直接输出datetime显示为早上6点。多多少少决定和时区设置有关系。从Dash看了django的时区配置,发现在网站的settings中有TIMEZONE这一选项,默认是UTC。据文档上上默认是加拿大的时区……所以把TIMEZONE改成上海就行了。

  • [python]路由表脚本生成程序

    老实说这是老东西了,自己之前用scala写过,用ruby写过,这次是用python第二次实现,github上这种生成脚本也挺多的,自己全当是练手。 这个脚本其实就是把apnic提供的数据过滤出指定数据并解析然后生成路由表更新脚本的程序。用途相信各位也清楚,以下是自己重复造轮子的过程: 程序的主逻辑是读取apnic数据,用正则表达式过滤和解析,用解析出来的数据生成路由表修改脚本和恢复脚本。 首先是读取apnic数据。个人的方式是查找当前目录,然后脚本所在目录,如果再没有自动下载文件到脚本所在目录并返回。这里没有read on fly,即边下载边读,也没有比对并确保最新的逻辑。之后可以考虑加上。

  • python linux administrator学习小结

    看《Python Linux Administrator》这本书时,我并不是按照从头到尾的方式读的,而是看了一遍目录,选择性地读了部分章节。以下是我选择的章节: GUI 有GUI肯定更直观一些,特别是在一些报表展示上。书中提到主要是三种方式,基于pygtk/wxPython的桌面程序,基于cursers的CLI方式和基于django的web方式。个人觉得web方式综合下面比较好一些,而且django并不比想象中要难。我也把django作为定期学习的一个候选。 network unix/linux下网络相关命令很多,python也有很多针对网络的库。书中介绍了从底层socket,到上层httplib/ftplib/paramiko(sftp),urllib/urllib2,xmlprclib/Pyro和强大的twisted。针对不同协议场景用不同的库,前提是你要了解足够多的网络库。 operaton system 通用的有platform,可以用来判断操作系统。接下来都是一些指定系统下的库,比如mac的dscl/asr,windows的zenoss,还有libvert, libvirt, cobbler, virt-factory, func等。这块和系统相关,个人认为要根据实际环境选择性的学习。 package manager 较多篇幅介绍了easy_install。同时提到了buildout, virtualenv, epm。个人对virutalenv有点兴趣,因为可以多版本python共存。 demo 一些使用python管理系统的实例。和之前介绍内容可能有交集。个人感兴趣的是python查询dns,还有python管理ldap等。 data 主要是操作文件。比如常用的os模块,还有glob,shutil,filecmp。用于产生摘要的hashlib等。更多的在python标准库文档中。

  • python标准库学习笔记3

    以下内容来自这里的学习。 类型判断 理论上动态语言不建议判断类型,不过python还是有提供判断的方法。 import types type(1) == types.IntType isinstance(1, int) 第一种是使用types模块,第二种是使用内建的isinstance方法。 decimal 因为Java有BigInteger和BigDecimal,所以不会陌生。 import decimal decimal.getcontext().prec = 7 # set precision to 7, default is 28 decimal.Decimal(1) # create from int decimal.Decimal(‘3.14’) # create from string decimal.Decimal(1) / decimal.Decimal(7) 默认decimal精度为28,可以通过getcontext()修改配置。带小数的建议使用字符串创建,否则你用decimal.Decimal(3.14)试试看。 分数 就是那种几分之几的分数。 import fractions fractions.Fraction(16, -10) # – 8/5 fractions.Fraction(decimal.Decimal(‘1.1’)) # 11/10 fractions.gcd(60, 56) #…

  • zero sum subsequence problem solution 1

    题目是这样的,给定一个整数序列,比如[1, 2, -1, 8, -9],要求找出一个子序列,其所有数字的和为0,比如子序列[2, -1, 8, -9],并输出子序列在主序列中的位置,比如[2, -1, 8, 9]在主序列[1, 2, -1, 8, -9]中的位置为[1, 4]。 以下是我想到的一个方法,暂时不清楚怎么计算这个的时间复杂度。原理是这样的,对于序列[1, 2, -1, 8, -9],设置一个和序列。初始为[0, 0, 0, 0, 0],长度和输入序列一致。 顺序读取输入序列,第一次遇到1,尝试在和序列的[0, 0]区别内增加1,结果为[1, 0, 0, 0, 0]。为什么这么做呢,这样,输入序列区间[0, 0]的和就计算出来了。 第二次遇到2, 尝试在和序列[0, 1]区间内增加2,结果为[3, 2, 0, 0, 0],这样,输入序列区间[0, 1], [1, 1]的和就计算出来了。没有发现0和序列。 接下来依此类推,发现[1, 4]区间的和为0,输出为(1, 4)。代码如下(python): #!/usr/bin/env python import sys def find_zero_sum_seq(seq): sums = [0] *…

  • [fabric]多种策略的工程同步

    继续接上篇。 理论上来说,rsync是最好的工程同步方式。只是和fabric自身的ssh登录没有整合,现在我找到了一个简单的解决方法。同时我也准备了其他两种方法:打包上传和远程svn update,这样加上不同步总共有四个部署策略。 解决rsync依赖主机名和密码的方法很简单:因为rsync是在本地运行,只要在rsync之前执行一个简单的远程命令就能获得主机名和密码。代码如下: remote_srcdir = ‘source’ run(‘hostname’) # simple workaround for host prompt local(‘sshpass -p %s rsync -pthrvz –delete –exclude=.git –exclude=*fabfile* –exclude=target . %s:%s’ % (env.password, env.host_string, remote_srcdir)) 这里写死是密码登录了,理论还有证书登录,暂时不考虑。 打包上传的方式,改造自upload_project import tempfile, os remote_srcdir = ‘source’ _, archive_path = tempfile.mkstemp() _, archive_name = os.path.split(archive_path) try: local(‘tar -cz –exclude-vcs –exclude=*fabfile* –exclude=target -f %s .’ %…

  • rsync与fabric

    接上篇。 最近学习rsync,突然想到自己之前使用fabric上传工程时与其用tar上传再解压缩还不如用rsync增量传输,后者可以更快。查了下fabric的文档,发现有提供几个方法: fabric.contrib.project.rsync_project(*args, **kwargs) fabric.contrib.project.upload_project(local_dir=None, remote_dir=”) 第一个就是使用rsync,第二个其实和我之前的方法一样采用压缩包传输的。rsync_project个人认为实际上就是local(“rsync xxx”)的模板,参数并不是很全。 但是使用了之后我还是考虑使用第二个方法upload_project,原因是rsync和fabric的ssh登录是分离的:rsync_project需要我重新输入一次密码,不输入的话就需要退化成local加上sshpass。再考虑到一开始可能没有输入密码,代码可能会变成这样: rsync_cmd = ‘rsync –exclude=.git –exclude=*fabfile* -pthrvz . -e ssh %s:source’ % env.host_string if env.password: local(‘sshpass -p %s %s’ % (env.password, rsync_cmd)) else: local(rsync_cmd) 如果不想输入两次密码的话,就必须在代码上或者命令行上写上密码,不是很安全。考虑再三,还是使用fabric提供的upload_project,虽然压缩可能慢一点。

  • 尝试用fabric部署应用

    说来惭愧,个人是最近才知道fabric的。但是一上手就觉得fabric非常不错,解决了我长久以来的部署问题。 原因我的部署方式是: 登录远程服务器 svn update/git pull deploy.sh 后来觉得把未测试的代码签入代码库不是很好,想直接复制本地代码到远程服务器上再部署,于是第一步变成了: 打包本地代码文件 scp到远程服务器上 在远程服务器上解压缩

  • pexpect和非UTF-8编码的ssh

    pexpect是一个用python实现的类似expect的库,支持ssh,ftp等协议的交互。 以前自己写了一篇使用expect+python拉取数据的文章,现在发现了pexpect,便想要完全用python来写。总觉得用expect生成中间文件不是很好。

  • python tip 2

    以下是作为有Java背景的人阅读《Python基础教程》做得一些笔记。 区间比较 python支持类似数学上的区间比较 age = 22 0 < age < 100 列表比较 比较有趣的功能,免得自己写循环比较了 [1, 2, 3] < [1, 2, 4] # True [1, [2, 3]] < [1, [2, 5]] # True