文章

Python 使用整理

Python 启动http服务器

1
2
# Python3
python -m http.server -cgi 8080

Python 取环境变量

1
2
import os
print(os.environ['YOURENVNAME'])

Python Function定义

1
2
def my_func(a, b):
    return a+b

Python 时间戳

1
2
3
4
5
6
import time
now = int(round(time.time()*1000))
now02 = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(now/1000))
now02
# Use below
now =  time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())

Python 获取网页信息

1
2
3
4
def get_html(url):
    req = requests.get(url=url)
    req.encoding="utf-8" #设置编码,否则有可能会乱码
    return req.text

Python 使用正则表达式

1
2
3
4
5
6
import re
regex = re.compile('<dt class=\"preview-item\"><a href=\"(.*?)\" title=\"(.*?)\" .*?>')
matches = regex.finditer(html)
for match in matches:
    print(match.group(0))
    print(match.group(1))

数据库SQLite3使用时中文编码问题

一、具体问题 读取十万多条文本写入SQLite类型数据库,由于文本中存在中文字符,插入到数据库没错,取出时一直是Unicode Decode Error,导致折腾了很长时间。 二、解决方法 Python连接数据时进行如下设置:

1
2
db=sqlite3.connection("...")
db.text_factory=str

另为了python代码中硬编码的中文字符串不出现问题,除了在源码开始添加

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

设置python源码的编码为utf-8

1
2
3
import sys
reload(sys)
sys.setdefaultencode('utf8')

安装机器学习库Sklearn出错

一、具体问题 使用pip或easy_install时一直出错,如can not import murmurhash3_32。

二、解决方法 下载后进行本地安装。 1 首先需要安装Cython,网上下载后进行本地安装 python setup.py install; 2 下载Sklearn包,进行本地安装; 3 安装后用nosetests -v sklearn来测试安装。

改变Python输出流的编码方式

一、改变文件输出流编码方式

最近玩BeautifulSoup,遇到了这样的问题: BeautifulSoup默认把 转换成’\xa0’了,结果gbk就没法输出了,因为这个玩意转换不到gbk,但我系统的文件输出编码方式默认就是gbk,所以需要改变文件的编码方式。

1 对于python 2.4以前的版本可以f=open(‘out.html’,’w’,’utf-8’)这样实现。 2 对于以后的版本,可以使用codecs类

1
f=code.open('out.html','w','utf-8')

然后就可以print »f,data或者f.write(data)来编码文件流了。

二、改变标准输出流的编码方式的方法

1
2
3
import codecs, sys
old=sys.stdout
sys.stdout = codecs.lookup('iso8859-1')[-1]( sys.stdout)

Python和C,C++进行混编

一、Python利用Boost库来调用C,C++

不使用boost.python库来直接构建dll的话比较繁琐,下面实例是借助boost库实现python对C、C++的调用。

1 首先确定已经安装python和boost库,本例测试环境是python2.7,boost_1_54_0 ,在vs平台下实现;

2 vs建立dll工程,配置上boost库的环境,记得包括python的依赖库:E:\Python27\include和E:\Python27\libs;

3 编写代码

下面是一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <string>  
#include <boost/python.hpp>  
using namespace boost::python;  

std::string strtmp;  
char const* Recognise(const char* url)  
{  
    strtmp="get data from dll...";  
    strtmp+=url;  
    return strtmp.c_str();  
}  

BOOST_PYTHON_MODULE(Pyutil)  
{  
    def("Recognise",Recognise);  
}

4 运行,将生成的dll和lib文件拷到python的工作目录,将dll的后缀该为pyd(注意不是pyc),然后就可以使用了。

1
2
3
import Pyutil  
result = Pyutil.Recognise("192.168.1.1")  
print "the result is: \n"+ result

5 需要注意的问题和可能遇到的问题

(1)dynamic module does not define init function,请检查模块的名字和dll的名字一致性;

(2)注意vs需要release下进行;

(3)使用boost静态python库的话需要在属性->Preprocessor->Preprocessor Definitions中定义BOOST_PYTHON_STATIC_LIB,否则编译的为动态,会提示找不到python_boost*.lib什么的。

二、Python利用Cython调用C,C++

利用Cython也可进行对C,C++函数的调用,相对与利用Boost库的方法要繁琐一些。

1 下载Cython,用python setup.py install进行安装。

2 一个实例

1) 创建helloworld目录

创建helloworld.pyx,内容如下:

1
2
3
4
cdef extern from"stdio.h":
    extern int printf(const char *format, ...) 
def SayHello():
    printf("hello,world\n")

2) 编译,利用python的Distutils

helloworld目录下创建Setup.py,内容如下:

1
2
3
4
5
6
7
8
9
10
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize

setup(
  name = 'helloworld',
  ext_modules=cythonize([
    Extension("helloworld", ["helloworld.pyx"]),
    ]),
)

编译:

1
python Setup.py build

编译完成后会在build/lib.???目录下生成的helloworld.pyd。

安装(将生成的helloworld.pyd拷贝到Python目录的Lib/site-packages),如果只想测试,则可以不进行安装,直接将生成的helloworld.pyd拷贝到工作目录即可。

1
python Setup.py install #安装

3) 测试:

1
2
3
>>import helloworld 
>>helloworld.SayHello() 
>>hello,world
本文由作者按照 CC BY 4.0 进行授权