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安装即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值