Python
sf2gis@163.com
2014年8月18日
2014年9月8日添加发布功能
2015年4月27日添加PyQt
1 概述
Python是由标准C语言构建的解释性语言。所以与C、C++具有原生支持的特性。Python具有API参考手册,可以支持与C进行交互。
Python是面向对象的弱类型语言,其开发目的就是为了简化C、C++的使用,用于测试或小型工程,或用于不同C++库之间的交互。因此,Python的设计原则就是简单,统一。
Python开发效率高而运行效率低,与C,C++互补,是大型工程中用于集成(效率模块要用C、C++开发)的良好工具。
参考:主要参考python help文档
1.1 why python?
目标:使用一种工具,在需求变动时,能够灵活的处理,减少代码量,简单发布,减少改动数量位置,增加重用性,易于扩展。
方法:C++、Java:只要有更改MVC任何部分,需要重新发布。扩展时也要重新发布。
Python、Perl、Ruby:MVC完全独立,可单独发布,单独修改。扩展时只需加入扩展模块,修改影响的模块,不需重新编译。代码量相对少。都使用OO,重用性强。
Python:易于理解。流行。
Perl、Ruby:流行程度不如Python(参考51job,猎聘)。
1.2 目标:使用python开发gui,cmd等工程
1.3 方法:pyCharm作为IDE进行调试和工程组织
2 解释器
python是一种解释性语言,需要调用解释器实时链编,其名称为python。
使用quit()或ctrl+z退出程序。
python是一个命令行程序,可以使用很多的参数,详见python –h使用说明。
python的main()函数由sys模块处理。但要注意,-c 命令。 –m 执行模块。
3 语言
3.1 语法
3.2 工程组织
3.2.1模块内书写组织
A. Uinx起始行
B. 文档注释
C. 模块导入
D. 变量定义
E. 类定义
F. 函数定义
G. 判断入口主函数
由于需要先声明后使用,所以应该将需要声明的内容放在最前面,然后是使用声明内容的放在后面。最后是判断当前的执行方法(调用或者导入)来执行相应的函数。
由于所有的Python都具有执行能力(不是c中只有main才能作为入口),所以应该将能够执行的代码放入函数中,并由主函数进行统一调用。
参考:http://www.pythondoc.com/pythontutorial27/index.html
4 库
5 常用操作
5.1 字符串->list转换
list(String)
5.2 list->String转换
split.join(list)
参考:http://piziyin.blog.51cto.com/2391349/568426
5.3 定义二维数组
将一维数组作为二维数组的元素。
lstTileCode = [[ppTileCode[i][j] for j in range(2)] for i in range(codecount)]
其中[ppTileCode[i][j] for j in range(2)]为一维数组,将为二维数组的元素。
for i in range(codecount) 则使用一维数组初始化二维数组。
参考:http://stackoverflow.com/questions/6667201/how-to-define-two-dimensional-array-in-python
5.4 函数返回多个值
返回一个list、tuple,并解析。
def test():
...
return (a,b)
a, b = test()
参考:http://stackoverflow.com/questions/9752958/how-can-i-return-two-values-from-a-function-in-python
5.5 创建和使用GUID、UUID
使用UUID模块。
一般使用UUID1()。
使用str(uuid)转化为字符串。
参考:https://docs.python.org/2/library/uuid.html
http://stackoverflow.com/questions/534839/how-to-create-a-guid-in-python
5.6 文件换行符:在windows下使用wb+模式,用\n
如:file(fn,'wb+').write('test\ntest2')
参考:http://www.zhihu.com/question/19751023
6 文件与目录
6.1 文件操作
参考:http://sebug.net/paper/python/ch12.html
http://zhou123.blog.51cto.com/4355617/1281393
6.1.1创建
可以使用file()(一般用于类型检测)或open()(推荐)生成file对象。
参见:open():打开文件。
6.1.2写入
1) 使用w模式打开文件
2) 写入数据。
3) 关闭文件
示例:
def save2File(strFileName, strText):
"""
save txt to file.
:param strFileName:
:param strText:
:return: no return
:author sf2gis@163.com
:date 2014-10-11 17:02:27
"""
fp = open(strFileName, "w")
fp.write(strText)
fp.close()
6.1.3读取
1) 循环读取读取数据
2) 如果返回空值,则到达尾部
示例:
def readFile(strFileName):
"""
read file.
:param strFileName:
:return:
:author sf2gis@163.com
:date 2014-10-11 17:11:32
"""
fp = open(strFileName, "r")
while True:
line = fp.readline()
if 0 == len(line):
break
print line
fp.close()
6.1.4删除
os.remove():删除文件。
os.rmdir():删除空文件夹。
shutil.rmtree():删除文件夹及内容。
参考:
http://stackoverflow.com/questions/6996603/how-do-i-delete-a-file-or-folder-in-python
6.2 Python文件所在的目录
__file__将返回文件的实际路径,但有时是绝对路径,有时是相对路径。
os.path.realpath(__file__):将返回文件的绝对路径。
os.path.split(path):将把文件路径和文件名分开。
os.path.split(os.path.realpath(__file__))[0] 将返回文件所有目录。
参考:http://www.elias.cn/Python/GetPythonPath?from=Develop.GetPythonPath
7 用户接口-CMD,GUI-TK、PySide,PyQt
7.1 命令行
目标:分析输入的命令行参数。据此执行不同的功能。
方法:sys.argv提供所有输入的参数列表list。然后逐个判断输入参数。一般采用-a来标识参数name,其后跟value。
lstArgv = sys.argv
iLen = len(lstArgv)
for i in range(iLen):
strArg = lstArgv[i]
if "-f" == strArg:
if i+1 <= iLen - 1:
strFileName = lstArgv[i+1]
7.1.1示例:
"""
parse input argv into different parameters.
:author sf2gis@163.com
:date 2014-10-09 15:12:02
"""
import os
import sys
from getlogger import *
def parseCmd():
"""
parse input argv into different parameters.
:return: no return.
:author sf2gis@163.com
:date 2014-10-09 15:12:02
"""
strFileName = None
iMaxBytes = None
iCount = None
lstArgv = sys.argv
iLen = len(lstArgv)
for i in range(iLen):
strArg = lstArgv[i]
if "-f" == strArg:
if i+1 <= iLen - 1:
strFileName = lstArgv[i+1]
elif "-max" == strArg:
if i+1 <= iLen - 1:
iMaxBytes = int(lstArgv[i+1])
elif "-c" == strArg:
if i+1 <= iLen - 1:
iCount = int(lstArgv[i+1])
print strFileName
print iMaxBytes
print iCount
logger = getLogger(strFileName, iMaxBytes, iCount)
for i in range(100):
logger.debug("test")
if __name__ == "__main__":
"""
test.passed.2014-10-09 17:12:07.sf2gis@163.com.
"""
parseCmd()
7.2 GUI
参见:pythonGUI-TK_Pyside.docx、PyQt.docx
8 C/C++交互库-Python调用C/C++:ctypes
9 C/C++交互库-C/C++调用Python:Python.h
Python提供了一个C/C++的API,包含绝大多数的Python Runtime功能。所有接口定义都在python.h中。
注意:头文件中包含许多与平台有关的设定,所以在使用任何python功能之前必须要包含此头文件。
所有与Python有关的对象、功能都有Py、PY前缀。
PyObject:表示一个不透明对象。所有类型都可以转化为PyObject。只能以指针的形式出现,不可构造对象,不可析构。
PyArg_ParseTuple
PyArg_ParseTuple(pythonobject,format,cobject):将python类型转换为C类型。
PyObject *Py_BuildValue(format,cobject):将c类型转换为python类型。
Python对象:PyObject.
Python函数:参见Python C APIhttps://docs.python.org/2/c-api/sys.html#system-functions
参考:https://docs.python.org/2/extending/extending.html
9.1C++调用Python
//pro
#-------------------------------------------------
#
# Project created by QtCreator 2014-08-19T10:56:00
#
#-------------------------------------------------
QT += core
QT -= gui
TARGET = console
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
INCLUDEPATH += C:/python27/include
LIBS += -LC:/python27/libs python27.lib
//main.cpp
#include <QCoreApplication>
#include <Python.h>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
PyObject * pModule = NULL;//声明变量
PyObject * pFunc = NULL;// 声明变量
pModule =PyImport_ImportModule("helloworld");//这里是要调用的文件名
if(NULL == pModule){
qFatal ("load file error\n");
return 0;
}
pFunc= PyObject_GetAttrString(pModule, "hello");//这里是要调用的函数名
PyEval_CallObject(pFunc, NULL);//调用函数
Py_Finalize();//调用Py_Finalize,这个根Py_Initialize相对应的。
return a.exec();
}
参考:
10 Python与其它语言的交互
java、.net
11 Python程序发布
将python程序发布为可以直接运行,不需要依赖Python解释器的程序。
python可以发布为各种格式的程序,一般不需要生成dll/so库,因为各种语言都有与python的接口,可以直接调用脚本,而生成库则需要将脚本封装,再在调用方进行解析,反而更加复杂。
py2exe可以将python程序转换为exe文件,并将所有依赖的dll等程序放置于同一个发布目录。
1) Py2exe需要一个脚本来配置,主要说明为哪些文件进行发布。
2) 然后以py2exe为参数运行发布脚本。
3) 可以将发布文件以NSIS等打包工具进行打包为单文件发布。
示例:
from distutils.core import setup
import py2exe
# Set options
options ={ 'py2exe':
{
'dll_excludes':['w9xpopen.exe'] #This file is for win9x platform
}
}
# Setup
setup ( options = options,
windows = [{
'script': 'hello.py'}]
)
#开始发布
python setup.py py2exe
参考:http://our2848884.blog.163.com/blog/static/146854834201371112428923/
12 Python作为程序架构的方法
1) 根据需求生成相应的设计及文档
2) 使用QTDesigner生成界面
3) 生成界面逻辑
参见:用户接口-CMD,GUI-TK、PySide,PyQt
4) 使用Python生成原型
5) 使用QT生成核心逻辑
6) 由Python装配核心及界面
参见:C/C++交互库-Python调用C/C++:ctypes
7) 打包发布
参见:Python程序发布
13 Python日志模块
14 Python测试框架
15 应用
15.1 SHELL功能:跨平台的批处理功能
15.1.1批量重名称
15.1.2文件移动
15.2 网络爬虫:Scrapy
参见:scrapy.docx
15.3 网络框架:Django
参见:Django.docx