python开发
多进程
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
进程间通信&进程池
python的标准包Queue只能用于单进程内。进程间通信使用multiprocessing.queue,这个仅限于子进程间通信。如果还要父进程子进程间通信,使用multiprocessing.manager.queue
def worker(queue):
while True:
try:
_ = queue.get_nowait()
except Queue.Empty:
break
if __name__ == '__main__':
manager = multiprocessing.Manager()
# queue = multiprocessing.Queue()
queue = manager.Queue()
for i in range(5):
queue.put(i)
processes = []
for i in range(2):
proc = multiprocessing.Process(target=worker, args=(queue,))
processes.append(proc)
proc.start()
for proc in processes:
proc.join()
异常处理
异常处理的方法很多,try except、traceback、raise等,可以查看异常信息,以及调用栈关系等
try except
一般形式如下
import sys
import traceback
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS error: {0}".format(err))
except ValueError:
val = traceback.format_exc() #traceback,显示调用栈关系,这一句非必须
print(val)
print("Could not convert data to an integer.")
except:
print("Unexpected error:", sys.exc_info()[0])
raise
日志
工程中一般通过日志读取文件配置,控制日志级别,控制台及日志文件的日志信息,也可以在代码中直接设置。
日志文件
[loggers] ;声明logger
keys=root,accessLogger,errorLogger
[handlers] ;声明handler
keys=accessHandler,errorHandler,consoleHandler
[formatters] ;声明format
keys=accessFmt,errorFmt
[logger_root] ;配置root logger
level=INFO
handlers=accessHandler
[logger_accessLogger] ;配置access logger
level=DEBUG ;级别
handlers=accessHandler ;使用的handler
propagate=0
qualname=accessLogger
[logger_errorLogger] ;配置error logger
level=ERROR
handlers=errorHandler
propagate=0
qualname=errorLogger
[handler_consoleHandler] ;配置stout handler
class=StreamHandler ;标准输出
level=DEBUG
formatter=accessFmt ;日志格式
args=(sys.stdout,)
[handler_accessHandler]
class=handlers.TimedRotatingFileHandler ;日志按时间分片
args=('access.log', 'midnight', 1, 30,) ;定义输出到哪个文件,按照什么标准分片
# class=FileHandler
# args=('./log/access.log', mode="a", maxBytes=1000, backupCount=3, encoding="utf-8") ;#日志文件最大1K,如果超过切片保留3个文件!!!!!
level=INFO
formatter=accessFmt
[handler_errorHandler]
class=handlers.RotatingFileHandler ;日志按大小分片
# class=FileHandler
args=('error.log', 1024 * 1024, 5,) ;分片标准
level=ERROR
formatter=errorFmt
[formatter_accessFmt]
format=[%(asctime)s %(filename)s:%(funcName)s:%(lineno)d %(levelname)s]->%(message)s
datefmt=%Y-%m-%d %H:%M:%S%z
class=logging.Formatter
[formatter_errorFmt]
format=[%(asctime)s %(filename)s:%(funcName)s:%(lineno)d %(levelname)s]->%(message)s
datefmt=%Y-%m-%d %H:%M:%S%z
class=logging.Formatter
#程序中使用配置项配置日志
import logging
import logging.config
CONF_LOG = "./config/config.ini"
logging.config.fileConfig(CONF_LOG); # 采用配置文件
logger = logging.getLogger('ProxyIP')
logger.info("Hello")
参数控制
argparser
argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块。
使用流程分为4步
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--sparse', action='store_true', default=False, help='GAT with sparse version or not.')
parser.add_argument('--epochs', type=int, default=10000, help='Number of epochs to train.')
args = parser.parse_args() #传入的参数存储在args里,字典形式
使用方式
python test.py --eopchs 100,args的值{‘sparse’: False, ‘epochs’: 100}
python test.py --eopchs 100 --sparse,args的值{‘sparse’: True, ‘epochs’: 100}
装饰器
怎么回事
先来看一个最简单的装饰器
def warp(obj):
return obj
没错!!!这就是最简单的装饰器,并且是一个没有任何用处的装饰器。但是它确实是一个装饰器,并且可以用的很好。比如:
@warp # 等价于 foo = warp(foo)
def foo():
print('hello decorator!')
foo() # => hello decorator!
而上面使用了装饰器的代码,其实我们可以通过其它方式达到相同的效果。具体见下:
def foo():
print('hello decorator!')
foo = warp(foo)
foo() # => hello decorator!
So,通过最简单的代码,我们可以发现装饰器其实就是接受了一个函数(对象),并且返回了一个函数(对象)的函数(可调用对象)。
上面是装饰器的最基本原理,它的用途和种类很多,可参考
装饰器学习
类
工程中一般通过日志读取文件配置,控制日志级别,控制台及日志文件的日志信息,也可以在代码中直接设置。
成员函数修饰词
staticmethod 声明了静态方法,从而可以实现实例化使用 C().f(),当然也可以不实例化调用该方法 C.f()
#!/usr/bin/python
# -*- coding: UTF-8 -*-
class C(object):
@staticmethod
def f():
print('runoob');
C.f(); # 静态方法无需实例化
cobj = C()
cobj.f() # 也可以实例化后调用
classmethod修饰符的作用类似于staticmethod,只是classmethod修饰的函数定义时,第一个参数是cls,其余用法同
super关键字修饰类成员函数
python函数继承有三种方法:
1.不重写,直接继承父类
2.完全重写
3.重写,但是先执行父类的这个函数,同时也执行重写的子类函数,使用super修饰
class Son(Father):
def __init__(self, name):
super(Son, self).__init__(name)
print("hi")
self.name = name
常用函数
enumerate
枚举函数,将一个可遍历对象,枚举并返回索引值,可以在遍历时使用,也可以组成新的数据
#遍历作用
seq = ['one', 'two', 'three']
for i, element in enumerate(seq):
print i, element
...
0 one
1 two
2 three
#组成新的数据
seasons = ['Spring', 'Summer', 'Fall', 'Winter']
list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
instance
instance(object, classinfo) 若objtect实例类型与classinfo类型一致,则返回 True, 否则返回 False.
instance(a, int) #判断a是否int型
format
字符串加入变量,log经常使用
"{1} {0} {1}".format("hello", "world") # 设置指定位置 输出'world hello world'
"hello :{.2f}".format(3.6666666)
不定参(*args和**kargs)
arg:当传入的参数格式统一,数量不定时,用args,本质上是一个tuple
def fun(*args):
temp_sum = 0
for num in args:
temp_sum+=num
return temp_sum
rlt = fun(1, 2, 3) #output 6
**kargs:参数格式不统一,数量不定时使用,kargs是采用字典的方式来收集传入的参数,**kargs的这种不定参。传参时,只能传key=val这类的键值对参数
def fun(x, **kargs):
print(kargs)
fun(x=3,a=1,b=2,c='china',d=True)
调试
pdb.set_trace()函数可以加入断点,在断点处程序停下可以debug
工具使用
anconda
1、创建和查看
创建虚拟环境
conda create -n py38 python=3.8
查看有哪些虚拟环境
conda info --envs
2、虚拟环境使用
进入环境
conda activate python38
查看已装了哪些包
conda list
3、推出虚拟环境
conda deactivate
4、虚拟环境打包迁移
# 打包虚拟环境
conda pack -n py36 -o py366.tar.gz
# 解压缩py366.tar.gz:
mkdir py366
tar -zxvf py366.tar.gz -C py366
# 修改虚拟环境下的bin/pip文件的路径,一般为: ~/minconda/envs/env_name/bin/pip
# 激活环境:
conda activate py366
pip
$ pip install -r requirements.txt #安装文件列表
pip install -e . #离线文件安装,如果是未压缩的包
pycharm使用
debug方法
如果运行需要传参,右键可以配置该文件的运行参数
F7:下一步,遇到函数会进去
F8:下一步,遇到函数会一下过去,8,顺滑过去
shift + F8,从当前函数跳出去,回去
F9:执行到下一个cusor,如果debug期间遇到很长的for循环,可以在循环下面打个断点,F9一下就过去了
标注工具
labelImg是一个可用于目标检测标注的工具,pip安装即可