标签归档:python

RSS feed of python

最后更新于 .

对于python,这几天一直有两个问题在困扰我:

  • 1.python中没办法直接取得当前的行号和函数名。这是有人在论坛里提出的问题,底下一群人只是在猜测python为什么不像__file__一样提供__line__和__func__,但是却最终也没有找到解决方案。
  • 2.如果一个函数在不知道自己名字的情况下,怎么才能递归调用自己。这是我一个同事问我的,其实也是获取函数名,但是当时也是回答不出来。

但是今晚!所有的问题都有了答案。 一切还要从我用python的logging模块说起,logging中的format中是有如下选项的:

%(name)s            Name of the logger (logging channel)
%(levelno)s         Numeric logging level for the message (DEBUG, INFO,
                    WARNING, ERROR, CRITICAL)
%(levelname)s       Text logging level for the message ("DEBUG", "INFO",
                    "WARNING", "ERROR", "CRITICAL")
%(pathname)s        Full pathname ...

最后更新于 .

还是先说一下背景吧,之前有写过C,C++代码中调用python脚本,但也仅是停留在浅尝辄止的地步,这次由于在fuload中要实现调用python的脚本,所以继续深入了解了一下。 提前打好招呼,这篇文章有点长,但是信息量也比较大,如果感兴趣希望能耐心读下去。 另外,文章中的代码都可以直接到fuload项目下看到: http://code.google.com/p/fuload/source/browse/#svn/trunk/src/slave/py_module

先来看一下so的cpp文件:

#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <python2.7/Python.h>
using namespace std;

#define PYMODULE_NAME   "fl_module"
#define PYFUNC_INIT ...

最后更新于 .

由于python语法的简洁,所以在写c代码的时候,有时候也会想能不能把C代码写的更简练一点,这几天遇到一个,给大家分享一下。 比如我们要用C写一个判断语句,然后根据不同的值返回不同的内容。

if(1 == val)
{
    return "this is one";
}
else if(2 == val)
{
    return "this is two";
}
else if(3 == val)
{
    return "this is three";
}

如果判断的逻辑很多,代码就会显得很臃肿(文中的例子用switch也可以,但是也还是很难看),如果用python,就会这样写(为了和C类比,这里没有用字典):

datas = [
(1,"this is one"),(2,"this is two"),(3,"this is three")
]
for v in datas ...

最后更新于 .

今天发文比较多,哈,实在是觉得知识就该及时沉淀下来,时间长了难免记忆会模糊。 OK,直接切入正题,之前http://t.vimer.cn上提过正在开发的fuload压力测试框架,由于是想拿python做胶水语言,所以不可避免的涉及到了进程间通信的问题。 简单来说就是,一个python写的主进程与多个c写的处理进程通信的问题。主进程启动之后,会启动多个c的处理进程,主进程会对处理进程发送数据,并控制处理进程。 这种情况在server的编写中比较常见,为了解耦一般会将接受数据的进程与处理进程分开,在c中的实现一般是主进程先fork出子进程,然后在子进程中调用exec将自身替换为处理进程,进程id不变。这样主进程即可拿到所有的子进程id进行统一管理。 python当然也可以通过这种方式来实现,fork+execv即可完美重现,但是这可是无所不能的python呀,是否有更好的方式呢? 有的!python2.4之后引入了subprocess模块,通过它,我们将不再需要繁琐的调用fork,execv等,其主要函数如下:

class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn ...

最后更新于 .

今天在开例会的时候,提到其他小组要做一个通用任务系统,会涉及到C++调用其他语言脚本开发的逻辑。之前倒是听互娱那边的同事说过,他们都是嵌入lua来进行脚本编程,但自己从来没试过。
而作为一个严重中毒的vim+python爱好者,其实我每天都在用vim直接执行python命令(如出名的pyflakes插件),想知道vim是怎么实现的,所以就自己试了一下。
由于家里没有linux开发环境,所以就在windows下用 Mingw + makefile的方式开发了。
先写一个简单的py程序:helloworld.py

def hello():
       print"hello,world!"

然后来写我们的c++代码:

py.cpp

#include<Python.h>//前面所做的一切配置都是为了调用这个头文件和相关库
int main()
{
    Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");
    PyObject * pModule = NULL;//声明变量
    PyObject * pFunc = NULL;// 声明变量
    pModule =PyImport_ImportModule ...

最后更新于 .

在C/C++中,我们存储时间时,一般都会使用unix时间戳,使用也非常简单:

time_t t = time(NULL);

关于用C++实现string和time_t的转化,本博也专门写了一篇文章:
时间time_t和string(char*)格式互转
但是在python中怎么实现操作unix时间戳呢?
本博也特意写了代码如下:

# -*- coding: utf-8 -*-

import time
import datetime

def StringToTime(strtime):
    t_tuple = time.strptime(strtime,"%Y-%m-%d %H:%M:%S")
    return time.mktime(t_tuple)

def StringToTime2(strtime):
    dt = datetime.datetime.strptime(strtime,"%Y-%m-%d %H ...

最后更新于 .

今天在测试的时候发现一个很诡异的问题,语言描述不清楚,直接看代码吧。为了测试各种可能性,我写了两种类继承的代码如下:

#!/usr/bin/python
#-*- coding: UTF-8 -*-

import re
import sys
import os
import json
import simplejson

class Foo(object):
    _data = 1

    def __init__(self,data):
        self._data = data
    def ShowFoo(self):
        print 'Foo',self._data

class Bar(Foo):
    def __init__(self,data):
        super(Bar,self).__init__(data)
    def ShowBar(self):
        #会报错 ...

最后更新于 .

今天在翻unix网络编程的时候,无意中看到了使用匿名定义结构体/类定义数组的一段代码。

于是写了测试代码如下:

#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;

struct st
{
    int a;
    int b;
    char *p;
    int c;
}sts[]={
    {1,1,"hh",1},
    {2,2,"ff",2}
};

class CObj
{
    public:
        int a;
        string s;
        int b;

}objs[]={
    {1,"x",11},
    {2,"y",22}
};

int main(int argc, const ...

最后更新于 .

上一篇文章说道在用python的suds库的时候,发的中文总是乱码(windows下还总是encode失败,真是杯具),无奈产品经理又死活都要求是中文,今天研究了一天,总算是搞定了。 说一下定位的过程。

1.先拿一段php的soap代码来看:

<?php 
$client = new SoapClient("http://ws.sb.com/messageservice.asmx?wsdl",Array('trace'=>True)); 
// 参数转为数组形式传递 
$aryPara = array('sender' => 'dantezhu', 
    'receiver' => 'dantezhu', 
    'title' => 'OZ评论消息提醒', 
    'msgInfo' => 'sss', 
    'messageType'=>0); 
// 调用远程函数 
$ret = $client->SendRTX($aryPara); 
var_dump($ret); 
echo $client->__getLastRequest(); 
?>

这段代码是能够正确的发送请求的,通过__getLastRequest打出发送包,如下:

< ...

最后更新于 .

一.美化你的bash
每次在进入一个很长的目录的时候,光标都会变得很靠右,很丑陋:

1

今天同事给了一段配置:

export PS1="\[\e[36;1m\]\u\[\e[0m\]@\[\e[33;1m\]\h\[\e[0m\]:\[\e[31;1m\]\w\[\e[0m\]\n\$ "

写入.profile后,会变成如下的样子,效果不错,哈哈:

2

二.在python中使用soap -- suds
今天需要通过soap来给RTX的其他用户发消息,于是研究了一下python中的soap包。
先是发现了SOAPpy,包括Dive into Python都推荐了这个包,不过经过我的试用之后,发现打死都显示不了任何数据,于是我搜啊。。终于在某个不起眼的角落看到了这样一段话:

Unfortunately, at the moment, I don't think there is ...