【1】下载安装
【2】注释
【3】字符串
【4】列表与元组
【5】字典
【6】日期和时间
【7】读取键盘输入(raw_input、input)
【8】文件
【9】常见模块
【10】异常处理
【11】openssl 1.0.1 升级到 1.0.2 (CentOS6.5 )
【12】gunicorn
【13】读取配置文件
【14】functools.singledispatch的使用
【15】Python 实现定时任务
【16】调用shell
【1】下载安装
#下载地址:
https://www.python.org/
https://www.python.org/ftp/python/3.7.2/
#linux安装(CentOS 6.5)(未解决ssl模块)
1>检测Python是否已经安装
pyhton
2>安装依赖环境
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel expat-devel gdbm-devel db4-devel libpcap-devel xz-devel gcc gcc-c++ libffi-devel
3>解压
tar -zxvf Python-3.7.2.tgz -C /opt
4>编译安装
mkdir /usr/local/python3 #此处新建文件夹作为python的安装路径,以免覆盖Python2版本
cd /opt/Python-3.7.2
./configure --prefix=/usr/local/python3 --with-ssl #需配置ssl,否则以后安装模块时可能报出现SSL错误。openssl 需1.0.2以上。
make && make install
5>建立新版本python的链接
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
6>查看版本
python -V
python3 -V
7>检查pip3是否正常可用,不行的话在创建一下pip3的软链接(Python 2.7.9 + 或 Python 3.4+ 以上版本都自带 pip 工具)
pip3 -V
#pip 9.0.1 from /usr/local/python3/lib/python3.6/site-packages (python 3.6)
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
8>如果还未安装pip,则可以使用以下方法来安装:
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py # 下载安装脚本
python3 get-pip.py # 运行安装脚本(注意:用哪个版本的 Python 运行安装脚本,pip 就被关联到哪个版本)
#部分 Linux 发行版可直接用包管理器安装 pip,如 Debian 和 Ubuntu:sudo apt-get install python-pip
#python3.7常见错误ModuleNotFoundError: No module named '_ctypes',其实是缺少了一个新需要的开发包libffi-devel,安装此包之后再次进行编译安装即可
yum install libffi-devel -y (包在base)
#Could not build the ssl module! Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().openssl 需升级openssl
#openssl升级后还是出错
#需要进到Modules里,修改Setup如下(一般升级完openssl,openssl默认就在/usr/local/ssl文件夹了),把这5行的注释去掉。再进行make && make install
# Socket module helper for socket(2)
_socket socketmodule.c
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=/usr/local/ssl
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto
#docker运行python
docker pull registry.cn-hangzhou.aliyuncs.com/shuangmu/python3.6.7
mkdir /docker/python
mkdir /docker/pyhton/myapp
##构建一个新的镜像
mkdir /docker/pyhton/build
vim /docker/python/build/Dockerfile
FROM registry.cn-hangzhou.aliyuncs.com/shuangmu/python3.6.7:latest
RUN mkdir /python \
&&apt-get update \
&&apt-get -y install freetds-dev \
&&apt-get -y install unixodbc-dev
COPY requirements.txt /python
RUN pip install -r /python/requirements.txt -i https://pypi.douban.com/simple
WORKDIR /python
EXPOSE 5000 6000 8000
CMD ["/bin/bash"]
vim /docker/python/build/requirements.txt
Django
djangorestframework
pyDes
PyMySQL
redis
requests
pymssql
pyodbc
paramiko
psutil
flask
docker build -t python_demo .
##启动镜像
docker run --name=python -P -dit -v /docker/python/myapp:/python -w /python python_demo
#windows安装python
安装executable installer;
或直接解压zip包并配置环境变量即可。
###Anaconda安装
Anaconda(官方网站)就是可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包及其依赖项。
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=A
配置安装目录至环境变量
【2】注释
1>#单行注释
2>'''
多行
注释
'''
3>"""
多行
注释
"""
【3】字符串
a=b=c="a"
a, b, c = 1, 2, "john"
a="abcde"
b=a[1:2]*3 #包含索引1,不包含索引2,重复3次
c=a[1:] #索引1开始至结尾
c=a[:1] #索引0开始,不包含索引1
c=a[:] #c=a
【4】列表与元组
list = [ 'runoob', 786 , 2.23, 'john', 70.2 ]
tuple = ( 'runoob', 786 , 2.23, 'john', 70.2 )
#截取方式同字符串,列表可更新,元组不可更新
tuple[2] = 1000 # 元组中是非法应用
list[2] = 1000 # 列表中是合法应用
【5】字典
dict = {}
dict['one'] = "This is one"
dict[2] = "This is two"
tinydict = {'name': 'john','code':6734, 'dept': 'sales'}
print dict['one'] # 输出键为'one' 的值
print dict[2] # 输出键为 2 的值
print tinydict # 输出完整的字典
print tinydict.keys() # 输出所有键
print tinydict.values() # 输出所有值
【6】日期和时间
import time; # 引入time模块
ticks = time.time()
print "当前时间戳为:", ticks
localtime = time.localtime(time.time()) #获取到的是一个元组 time.struct_time(tm_year=2016, tm_mon=4, tm_mday=7, tm_hour=10, tm_min=3, tm_sec=27, tm_wday=3, tm_yday=98, tm_isdst=0)
print "本地时间为 :", localtime
localtime = time.asctime( time.localtime(time.time()) ) #格式化时间 Thu Apr 7 10:05:21 2016
print "本地时间为 :", localtime
print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) # 格式化成2016-03-20 11:45:39形式
print time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()) # 格式化成Sat Mar 28 22:24:24 2016形式
a = "Sat Mar 28 22:24:24 2016"
print time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y")) # 将格式字符串转换为时间戳
import calendar #引入日历模块
cal = calendar.month(2016, 1)
print ("以下输出2016年1月份的日历:"),print (cal)
【7】读取键盘输入(raw_input、input)
#Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘。如下:
str = raw_input("请输入:")
print "你输入的内容是: ", str
#input 可以接收一个Python表达式作为输入,并将运算结果返回。
str = input("请输入:")
print "你输入的内容是: ", str
#请输入:[x*5 for x in range(2,10,2)]
#你输入的内容是: [10, 20, 30, 40]
【8】文件
#语法:
file object = open(file_name [, access_mode][, buffering]) #open() 方法一定要保证关闭文件对象,即调用 close() 方法
#file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
#access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。这个参数是非强制的,默认文件访问模式为只读(r)。
#buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
#File对象的属性
file.closed 返回true如果文件已被关闭,否则返回false。
file.mode 返回被打开文件的访问模式。
file.name 返回文件的名称。
file.softspace 如果用print输出后,必须跟一个空格符,则返回false。否则返回true。
file.read([count]) #被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾。
file.tell()方法告诉你文件内的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后。
file.seek(offset [,from])方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。
【9】常见模块
#os模块提供了执行文件处理操作的方法,比如重命名和删除文件。
os.rename(current_file_name, new_file_name)
os.remove(file_name)
os.mkdir("newdir")
os.chdir("newdir") #切换当前目录
os.getcwd() #返回当前目录
os.rmdir('dirname')
#requests 模块(pip3 install requests)
import requests
r0 = requests.get("http://yunweicai.com") ##发送get请求
【10】异常处理
try:
<语句> #运行别的代码
except <名字>:
<语句> #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句> #如果引发了'name'异常,获得附加的数据
else:
<语句> #如果没有异常发生
--------------------------------------------------------
try:
正常的操作
......................
except:
发生异常,执行这块代码
......................
else:
如果没有异常执行这块代码
--------------------------------------------------------
try:
fh.write("这是一个测试文件,用于测试异常!!")
finally:
print "关闭文件"
fh.close()
--------------------------------------------------------
#用户自定义异常
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
try:
raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args
【11】openssl 1.0.1 升级到 1.0.2 (CentOS6.5 )
#下载安装包
wget https://www.openssl.org/source/openssl-1.0.2.tar.gz
#解压并进入解压目录后执行:
./config --prefix=/usr/local/openssl shared zlib
make
make install
#重命名原来的openssl
mv /usr/bin/openssl /usr/bin/openssl.old
#重命名原来的openssl目录
mv /usr/include/openssl /usr/include/openssl.old
#将安装好的openssl 的openssl命令软连到/usr/bin/openssl
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
#将安装好的openssl 的openssl目录软连到/usr/include/openssl
ln -s /usr/local/openssl/include/openssl/ /usr/include/openssl
#执行命令查看openssl依赖库版本是否为1.0.2,若出错检查系统自带的openssl库文件,如/usr/local/lib64/libssl.so
openssl version
#mv /usr/lib64/libssl.so /usr/lib64/libssl.so.old
#ln -s /usr/local/openssl/lib/libssl.so /usr/lib64/libssl.so
#mv /usr/lib64/pkgconfig/libssl.pc /usr/lib64/pkgconfig/libssl.pc.old
#ln -s /usr/local/openssl/lib/pkgconfig/libssl.pc /usr/lib64/pkgconfig/libssl.pc
#在/etc/ld.so.conf文件中写入openssl库文件的搜索路径
echo "/usr/local/openssl/lib/" >> /etc/ld.so.conf
#使修改后的/etc/ld.so.conf生效
ldconfig -v
【12】gunicorn
#gunicorn是一个python Wsgi http server,只支持在Unix系统上运行,来源于Ruby的unicorn项目
#gunicorn的安装非常简单,pip install guncorn 即可。后续如果用到异步的worker模型,还需要安装对应的模块(如gevent)
gunicorn -w 4 -b 0.0.0.0:8080 main:app #-b 表示 gunicorn 开发的访问地址 -w 表示开启多少个线程
【13】读取配置文件
python读取配置文件&&简单封装
#readCondig.py
import configparser
import os
#work_dir = os.path.dirname(os.path.abspath(".")) # 获取当前文件所在目录的上一级目录
work_dir = os.path.dirname(os.path.abspath(__file__)) # 获取当前文件所在目录
configpath=os.path.join(work_dir,"config.ini")
print("配置文件:",work_dir)
cf = configparser.ConfigParser()
#cf.read("/root/temp/python-test/config.ini") # 读取配置文件,如果写文件的绝对路径,就可以不用os模块
cf.read(configpath)
secs = cf.sections() # 获取文件中所有的section(一个配置文件中可以有多个配置,如数据库相关的配置,邮箱相关的配置,每个section由[]包裹,即[section]),并以列表的形式返回
print(secs)
options = cf.options("remote") # 获取某个section名为remote所对应的键
print(options)
items = cf.items("remote") # 获取section名为remote所对应的全部键值对
print(items)
host = cf.get("remote", "host") # 获取[remote]中host对应的值
print(host)
【14】functools.singledispatch的使用
functools.singledispatch 是作为装饰器来使用的,他可以把整体方案拆分成,多个小的模块,甚至可以为你无法修改的类提供专门的函数。
使用 @singledispatch 装饰的普通函数会变成泛函数(generic function):根据第一个参数的类型,以不同方式执行相同操作的一组函数.
from functools import singledispatch
import numbers
@singledispatch
def sort_type(obj):
print(obj, type(obj), 'obj')
@sort_type.register(str)
def _(text):
print(text, type(text), 'str')
@sort_type.register(numbers.Integral)
def _(n):
print(n, type(n), 'int')
#_ 函数都注册到了sort_type 这个函数上,然后当给sort_type 传参的时候会根据传入的参数判断要输出的内容
【15】Python 实现定时任务
参考链接
- 循环 sleep
from datetime import datetime
import time
# 每n秒执行一次
def timer(n):
while True:
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
time.sleep(n)
# 5s
timer(5)
- APScheduler定时框架
#APScheduler是一个 Python 定时任务框架,使用起来十分方便。提供了基于日期、固定时间间隔以及 crontab 类型的任务,并且可以持久化任务、并以 daemon 方式运行应用。
#使用 APScheduler 需要安装
pip install apscheduler
#周一到周五每天早上6点半执行的例子
from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime
# 输出时间
def job():
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
# BlockingScheduler
scheduler = BlockingScheduler()
scheduler.add_job(job, 'cron', day_of_week='1-5', hour=6, minute=30)
scheduler.start()
#配置说明
1.APScheduler 四个组件分别为:触发器(trigger),作业存储(job store),执行器(executor),调度器(scheduler)。
2.触发器(trigger)
包含调度逻辑,每一个作业有它自己的触发器,用于决定接下来哪一个作业会运行。除了他们自己初始配置意外,触发器完全是无状态的APScheduler 有三种内建的 trigger:
date: 特定的时间点触发
interval: 固定时间间隔触发
cron: 在特定时间周期性地触发
3.作业存储(job store)
存储被调度的作业,默认的作业存储是简单地把作业保存在内存中,其他的作业存储是将作业保存在数据库中。一个作业的数据讲在保存在持久化作业存储时被序列化,并在加载时被反序列化。调度器不能分享同一个作业存储。
APScheduler 默认使用 MemoryJobStore,可以修改使用 DB 存储方案
4.执行器(executor)
处理作业的运行,他们通常通过在作业中提交制定的可调用对象到一个线程或者进城池来进行。当作业完成时,执行器将会通知调度器。最常用的 executor 有两种:
ProcessPoolExecutor
ThreadPoolExecutor
5.调度器(scheduler)
通常在应用中只有一个调度器,应用的开发者通常不会直接处理作业存储、调度器和触发器,相反,调度器提供了处理这些的合适的接口。配置作业存储和执行器可以在调度器中完成,例如添加、修改和移除作业。
BlockingScheduler是APScheduler中的调度器,APScheduler 中有两种常用的调度器,BlockingScheduler 和 BackgroundScheduler;
当调度器是应用中唯一要运行的任务时,使用 BlockingSchedule,如果希望调度器在后台执行,使用 BackgroundScheduler。
#调度器配置示例
#创建了一个 BlockingScheduler,并使用默认内存存储和默认执行器。(默认选项分别是 MemoryJobStore 和ThreadPoolExecutor,其中线程池的最大线程数为10)。配置完成后使用 start() 方法来启动。
sched = BlockingScheduler()
sched.add_job(job, 'interval', seconds=5)
sched.start()
6.job 的操作
添加、移除、暂停、恢复、获取 job 列表、修改Job、关闭 等。
7.trigger规则
#date最基本的一种调度,作业只会执行一次。它的参数如下:
sched.add_job(my_job, 'date', run_date=date(2009, 11, 6), args=['text'])
sched.add_job(my_job, 'date', run_date=datetime(2009, 11, 6, 16, 30, 5), args=['text'])
sched.add_job(my_job, 'date', run_date='2009-11-06 16:30:05', args=['text'])
# The 'date' trigger and datetime.now() as run_date are implicit
sched.add_job(my_job, args=['text'])
#cron
# of June, July, August, November and December at 00:00, 01:00, 02:00 and 03:00
sched.add_job(job_function, 'cron', month='6-8,11-12', day='3rd fri', hour='0-3')
# Runs from Monday to Friday at 5:30 (am) until 2014-05-30 00:00:00
sched.add_job(job_function, 'cron', day_of_week='mon-fri', hour=5, minute=30, end_date='2014-05-30')
#interval
# Schedule job_function to be called every two hours
sched.add_job(job_function, 'interval', hours=2)
# The same as before, but starts on 2010-10-10 at 9:30 and stops on 2014-06-15 at 11:00
sched.add_job(job_function, 'interval', hours=2, start_date='2010-10-10 09:30:00', end_date='2014-06-15 11:00:00')
【16】调用shell
Python调用shell命令常用方法
###方法一
使用os模块的system方法:os.system(cmd),其返回值是shell指令运行后返回的状态码,int类型,0表示shell指令成功执行,256表示未找到,该方法适用于shell命令不需要输出内容的场景。
#示例
import os
val = os.system('ls -al')
print val
###方法二
使用os.popen(),该方法以文件的形式返回shell指令运行后的结果,需要获取内容时可使用read()或readlines()方法。
###方法三
使用commands模块,有三个方法可以使用:
(1)commands.getstatusoutput(cmd),其以字符串的形式返回的是输出结果和状态码,即(status,output)。
(2)commands.getoutput(cmd),返回cmd的输出结果。
(3)commands.getstatus(file),返回ls -l file的执行结果字符串,调用了getoutput,不建议使用此方法
###方法四
subprocess模块,允许创建很多子进程,创建的时候能指定子进程和子进程的输入、输出、错误输出管道,执行后能获取输出结果和执行状态。