存档

‘Perl/Python’ 分类的存档

python调用shell脚本方法

2010年7月15日 admin 没有评论

       python调用Shell脚本,有两种方法:os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容。实际使用时视需求情况而选择。
现假定有一个shell脚本

test.sh:                                                                                                                                    
#!/bin/bash

echo "hello world!"
exit 3

os.system(cmd):

该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码,即脚本中“exit 1”的代码执行后,os.system函数返回值的高位数则是1,如果低位数是0的情况下,则函数的返回值是0×100,换算为10进制得到256。

如果我们需要获得os.system的正确返回值,那使用位移运算可以还原返回值:
>>> n = os.system(test.sh)
>>> n >> 8
>>> 3

os.popen(cmd):

这种调用方式是通过管道的方式来实现,函数返回一个file-like的对象,里面的内容是脚本输出的内容(可简单理解为echo输出的内容)。使用os.popen调用test.sh的情况:
>>> file = os.popen(test.sh)
>>> file.read()
>>> ‘hello world!\n’

明显地,像调用"ls"这样的shell命令,应该使用popen的方法来获得内容。

分类: Perl/Python 标签: , ,

try-except-finally-in-python-2.4

2010年5月25日 admin 1 条评论

在python2.5 及以后的版本中,支持下面的写法

try:
   sth
except:
    other
finally:
    clean

但是在Python2.4版中,不支持上面的写法,只支持嵌套的写法:

try:

    try:

    except:

finally:

由于版本间的差异引起的迷惑比较难找。

分类: Perl/Python 标签:

Python speed up: The Fast Python

2010年5月23日 admin 没有评论

本文翻译自Python wiki,介绍了Python代码优化的一些注意点,原文地址:Python speed up

================== 分割线================================

0 PythonSpeed,PerformanceTips

      这篇文章致力于阐述各种提示和技巧,来帮助提高优化python程序的性能。其中有些内容来自于其他热心人,我都尽我所能的列出原始出处。

      自从1996年,我首次撰写“最快的python”一文以来,python经历了巨大的变化。这意味着文中的有些法则也需要修改。为了能让所有的热心人和爱好者共同维护,我将该文同时发布在了python wiki页。

      对于文中提到的法则和技巧,应该尽可能的在你所使用的python版本环境下,自己写代码来验证,而不是单纯的接受这些技巧,盲目的认为方法A要比方法B快。

1.1 优化需要优化的地方

俗话说,在保证代码正确运行前,不要试图去做过度优化。即只有在我们的代码能给出正确结果后,才能去发现到底是哪方面导致我们的程序跑的如此之慢。发现之后,通过对照文本的一些法则技巧,来发现具体程序的哪部分消耗了较多的时间。一个快速和全面的测试套件可以保证在接下来的优化过程中,不会影响代码的正确性。

代码的优化过程往往如下,循环往复

1. 确保代码运行时正确的

2. 测试代码的正确性

3. 分析速度慢的原因(如果性能达不到要求的话^^)

4. 优化

5. 重复2~5

一个好的编程风格,在一定程度上可以帮助优化代码的性能,所以建议像学习语言本身一样来学习编程风格 。一个例子,计算常量的操作,不应该放到循环内部,应该放到循环外,这样可以提高程序的性能。

阅读全文…

webpy 学习笔记(1)

2010年3月18日 admin 没有评论

web.ctx

http://webpy.org/cookbook/ctx/zh-cn

web.ctx保存每个HTTP请求的特定信息,比如客户端环境变量。假设,我们想知道正在访问某页面的用户是从哪个网页跳转而来的:

class example:

def GET(self):

    referer = web.ctx.env.get(’HTTP_REFERER’, ‘http://google.com‘)

    raise web.seeother(referer)

子应用下如何使用session

首先在main.py中初始化session

session = web.session.Session(app, web.session.DiskStore(’sessions’),

initializer = {’test’: ‘woot’, ‘foo’:”})

接下来创建一个被web.loadhook加载的处理器(processor)

def session_hook():

    web.ctx.session = session

    app.add_processor(web.loadhook(session_hook))

在子应用(假设是sub-app.py)中,可以这样操作session:

print web.ctx.session.test

web.ctx.session.foo = ‘bar’

loadhook and unloadhook函数

web.loadhook(handler)函数在web请求被处理前执行handler函数

web.unloadhook(handler)函数在web请求被处理后执行handler函数

seeother和redirect的区别

seeother: 303临时重定向

redirect: 301永久重定向

另:seeother(../) seeother(/)要注意,前者返回到上已成目录,后者重定向到当前目录,后者是一种错误的用法,会造成无限次的重定向。

使用web.py创建一个blog

2010年3月5日 admin 没有评论

otherrrr@gmail.com原创,转载请注明原作者地址:otherrrr 的百度空间

注:本文针对web.py 0.23版,以及python 2.5.1;
      如果您使用web.py 0.1x版,或python 2.4.x,
      那么有些功能会有所不同

01、准备工作

先安装Python,然后安装web.py。
不会安装的朋友,参考本博客的其他文章。
数据库我准备使用Python自带的sqlite,因此不用另安装其他数据库。
(我的运行环境是在Windows 2003下面,因为Python是跨平台的,所以理论上在Linux下面一样可行,但是我没有测试)
当前程序版本:Python 2.5.1,web.py 0.23。
(Python的官方网站:http://www.python.org
(web.py的官方网站:http://webpy.org

02、数据库

数据库我是用sqlite,主要是我并不会做一个大大大大的blog,用mysql是不是太浪费了?
而且sqlite现在python也集成了,用起来很方便。
(当然也可以用mysql,很流行的,如果想使用mysql的话,请搜一下“MySQLdb”)
(在web.py 0.23版本中,目前只支持3种数据库:postgres、mysql、sqlite)

那么不用数据库可不可以?当然可以。我其实很喜欢用txt文件,呵呵。
但是大家都用,我们最好也用。
(很久很久之后的将来,你会发现用数据库的好处)

我创建一个Python源程序文件:database.py,然后写一些代码来创建一个数据库,并插入一些文件。

代码如下:

阅读全文…

分类: Perl/Python 标签: ,

2.6 HTTP POST

2009年12月6日 admin 没有评论

一些表单使用GET方法来传递参数到服务器端,另外一种方法是采用POST。两者的不同在于采用POST方式时,参数部分是在请求的body部分,而GET请求方法则将参数encode之后,附在请求URL的后面。

Babelfish(http://babelfish.altavista.com)提供一项语言翻译的服务。从浏览器访问Babelfish时,在html表单中输入你需要翻译的文本,选定好需要翻译的语言种类,点击翻译按钮提交后,在一个新的页面中会展现出翻译结果。(译者注:该网站目前已变为yahoo的一个二级页面了)

在这个过程中,浏览器从表单中提取以下key/value值:

urltext = I like pie

lp = en_fr

enc = utf8

 

阅读全文…

分类: LWP, Perl/Python 标签: ,

2.5 do_GET的一个完整例子

2009年12月6日 admin 没有评论

2.5 do_GET的一个例子

阅读全文…

分类: LWP, Perl/Python 标签: ,

perl实现毫秒计数—select

2009年12月2日 admin 没有评论

Not HiRes But use function select

perl中的time函数只能精确到秒,sleep也只能精确到秒,即sleep(0.5),那么程序会sleep 1秒钟。当然cpan上有个NB的模块 Time::HiRes,可以提供精确到ns(10的-9次方秒)级别的sleep,该模块在最新的perl版本中已默认安装。但是如果不幸,你的perl版本<=5.8.5,那么需要额外安装Time::HiRes包。这会给脚本的通用性和可发布性造成了一定的伤害。这里提供一种折中的方法——使用select函数:

原理:select( undef, undef, undef, 0.005 )——函数会阻塞0.005s

我们来实现一个简单的、易用的计时器

阅读全文…

HTTP 协议状态码

2009年9月26日 laiwei 没有评论

http协议通讯时,在客户端发送请求后,服务器端返回的状态码解释。

http状态码

1**:请求收到,继续处理
2**:操作成功收到,分析、接受
3**:完成此请求必须进一步处理
4**:请求包含一个错误语法或不能完成
5**:服务器执行一个完全有效请求失败 阅读全文…

分类: Perl/Python 标签: ,

perl——多线程Scalars leaked: 1

2009年9月20日 laiwei 没有评论

很奇怪
在使用perl多线程时,在每次创建子线程的时候都会报出:Scalars leaked: 1
测试复现代码如下:

#!/usr/bin/perl -w
use threads ;
use threads::shared;

my %h = (
‘1′=>’a',
‘2′=>’b',
‘3′=>’c',
);

&main(\%h);

sub main {
     my ($in) = @_;
     foreach my $i (0..4){
           threads->new ( \&sub_func, $in );
     }

     threads->list()->join();
}
sub sub_func{
     my ($arg1) = @_;
     print “$arg1->{1} —”;
     print threads->self->tid;
     print “\n”;
}

查看运行结果:

perl 多线程 scalars leaked 错误

perl 多线程 scalars leaked 错误

果然Scalars leaked: 1了

经过反复试验,终于找到了罪魁祸首:
在main函数中,在threads->new之前,使用了my ($in) = @_这句赋值语句造成的。
我们应该将其替换为:my $in = shift;

再来看看
代码改为如下:

sub main {
           my $in = shift;
           foreach my $i (0..4){
                  threads->new ( \&sub_func, $in );
           }

           threads->list()->join();
}

运行查看结果:

perl 多线程 scalar leak 错误修复

perl 多线程 scalar leak 错误修复

OK,问题解决了。

总结:看来造成scalars leak的原因是魔法@_引起的,可能是@_的含义太多了的缘故吧,也可能是perl threads模块的bug吧,所以在目前来看,避免这种问题的做法是:在需要new子线程的同一范围内不要使用@_魔法字符

注:perl版本 5.8.5