当前位置:   article > 正文

Python 常用内置模块详解_python pyls

python pyls

Python 标准库非常庞大,所提供的组件涉及范围十分广泛,正如以下内容目录所显示的。这个库包含了多个内置模块 (以 C 编写),Python 程序员必须依靠它们来实现系统级功能,例如文件 I/O,此外还有大量以 Python 编写的模块,提供了日常编程中许多问题的标准解决方案。其中有些模块经过专门设计,通过将特定平台功能抽象化为平台中立的 API 来鼓励和加强 Python 程序的可移植性。

OS 基础模块

OS模块提供了多数操作系统的功能接口函数,当OS模块被导入后,它会自适应于不同的操作系统平台,根据不同的平台进行相应的操作,在Python编程时,经常和文件、目录打交道,所以离不了OS模块,OS模块也是在开发中最常用到的模块之一,本节内容将对OS模块提供的函数进行详细的解读,先来看一下OS模块的常用参数吧.

  1. import os
  2. os.getcwd() #获取当前工作目录,即当前python脚本工作的目录路径
  3. os.chdir("dirname") #改变当前脚本工作目录,相当于shell下cd
  4. os.curdir #返回当前目录: ('.')
  5. os.pardir #获取当前目录的父目录字符串名:('..')
  6. os.makedirs('dir1/dir2') #生成多层递归目录,此处递归生成./dir1/dir2
  7. os.removedirs('dirname') #若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
  8. os.mkdir('dirname') #创建目录,创建一个新的目录
  9. os.rmdir('dirname') #删除空目录,若目录不为空则无法删除,报错
  10. os.listdir('dirname') #列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
  11. os.walk('dirname') #遍历所有目录,包括子目录
  12. os.remove() #删除一个文件
  13. os.rename("oldname","new") #重命名文件/目录
  14. os.stat('path/filename') #获取文件/目录信息
  15. #-----------------------------------------------------------------------------------
  16. os.sep #查系统特定的路径分隔符,win下为"\\"; Linux下为"/"
  17. os.name #查看字符串指示当前使用平台.win->'nt'; Linux->'posix'
  18. os.linesep #查看平台使用的行终止符,win下为"\t\n"; Linux下为"\n"
  19. os.pathsep #查看当前,用于分割文件路径的字符串
  20. os.system("shell") #运行shell命令,直接显示,不能保存执行结果
  21. os.popen("shell").read() #运行shell命令,可以保存执行结果
  22. os.environ #获取系统环境变量
  23. #-----------------------------------------------------------------------------------
  24. os.path.abspath(path) #返回path规范化的绝对路径
  25. os.path.split(path) #将path分割成目录和文件名二元组返回
  26. os.path.dirname(path) #返回path的目录,其实就是os.path.split(path)的第一个元素
  27. os.path.basename(path) #返回path最后的文件名,如何path以/或\结尾,那么就会返回空值.
  28. os.path.exists(path) #如果path存在,返回True.如果path不存在,返回False
  29. os.path.isabs(path) #如果path是绝对路径,返回True
  30. os.path.isfile(path) #如果path是一个存在的文件,返回True,否则返回False
  31. os.path.isdir(path) #如果path是一个存在的目录,则返回True,否则返回False
  32. os.path.join(path) #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
  33. os.path.getatime(path) #返回path所指向的文件或者目录的最后存取时间
  34. os.path.getmtime(path) #返回path所指向的文件或者目录的最后修改时间

SYS 系统模块

Python的SYS模块提供访问解释器使用或维护的变量,和与解释器进行交互的函数.通俗来讲,SYS模块负责程序与Python解释器的交互,提供了一系列的函数和变量,用于操控Python运行时的环境,SYS模块也Python默认集成的模块,它被集成在了Python的解释器里,是必须的模块.

  1. import sys
  2. sys.argv #命令行参数列表,第一个元素是程序本身路径
  3. sys.exit(n) #退出程序,正常退出时exit(0)
  4. sys.version #获取Python解释程序的版本信息
  5. sys.path #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
  6. sys.platform #返回操作系统平台名称
  7. sys.stdin #输入相关
  8. sys.stdout #输出相关
  9. sys.stderror #错误相关

取出命令行参数: 命令行参数列表,第一个元素是程序本身路径,可遍历出具体传入参数数量.

  1. import sys
  2. for x in sys.argv:
  3. print(x)

判断系统版本: 通过使用sys.platform()函数,可以判断当前系统版本.

  1. >>> import sys
  2. >>>
  3. >>> sys.platform
  4. 'win32'

返回当前模块路径: 通过使用sys.path()函数,可遍历出python的当前路径.

  1. >>> sys.path[0]
  2. ''
  3. >>> sys.path[1]
  4. 'C:\\Users\\LyShark\\AppData\\Local\\Programs\\Python\\Python37\\python37.zip'
  5. >>> sys.path[2]
  6. 'C:\\Users\\LyShark\\AppData\\Local\\Programs\\Python\\Python37\\DLLs'
  7. >>> sys.path[3]
  8. 'C:\\Users\\LyShark\\AppData\\Local\\Programs\\Python\\Python37\\lib'

实现动态进度条: 使用标准输入与输出,实现动态进度条小实例.

  1. import sys
  2. import time
  3. def view_bar(num,total):
  4. rate = num / total
  5. rate_num = int(rate * 100)
  6. r = '\r%s%d%%' % (">"*num,rate_num)
  7. sys.stdout.write(r)
  8. sys.stdout.flush()
  9. if __name__ == '__main__':
  10. for i in range(0, 100):
  11. time.sleep(0.1)
  12. view_bar(i, 100)

Hashlib 模块

Python里面的hashlib模块提供了很多加密的算法,该模块实现了许多不同安全散列和消息摘要算法的通用接口,包括FIPS安全散列算法SHA1,SHA224,SHA256,SHA384和SHA512以及RSA的MD5算法,"安全散列"和"消息摘要"是可互换的,较旧的算法称为消息摘要,现代术语是安全散列.

MD5加密: MD5消息摘要算法,被广泛使用的密码散列函数,可产生出一个128位的散列值(hash value).

  1. import hashlib
  2. # ######## md5 ########
  3. hash = hashlib.md5()
  4. # help(hash.update)
  5. hash.update(bytes('admin', encoding='utf-8'))
  6. print(hash.hexdigest())
  7. print(hash.digest())

SHA1加密: SHA安全哈希算法主要适用于数字签名DSA算法,SHA1会产生一个160位的消息摘要(已被淘汰).

  1. import hashlib
  2. ######## sha1 ########
  3. hash = hashlib.sha1()
  4. hash.update(bytes('admin', encoding='utf-8'))
  5. print(hash.hexdigest())

SHA256加密: SHA安全哈希算法主要适用于数字签名DSA算法,SHA256算法的哈希值大小为256位.

  1. import hashlib
  2. # ######## sha256 ########
  3. hash = hashlib.sha256()
  4. hash.update(bytes('admin', encoding='utf-8'))
  5. print(hash.hexdigest())

SHA384加密: SHA安全哈希算法主要适用于数字签名DSA算法,SHA256算法的哈希值大小为384位.

  1. import hashlib
  2. # ######## sha384 ########
  3. hash = hashlib.sha384()
  4. hash.update(bytes('admin', encoding='utf-8'))
  5. print(hash.hexdigest())

SHA512加密: SHA安全哈希算法主要适用于数字签名DSA算法,SHA256算法的哈希值大小为512位.

  1. import hashlib
  2. # ######## sha512 ########
  3. hash = hashlib.sha512()
  4. hash.update(bytes('admin', encoding='utf-8'))
  5. print(hash.hexdigest())

MD5加盐加密: 以上的几个加密算法通过撞库可被破解,所以有必要对加密算法中添加自定义KEY再来做双重加密.

  1. import hashlib
  2. # ######## md5 ########
  3. hash = hashlib.md5(bytes('898oaFs09f',encoding="utf-8"))
  4. hash.update(bytes('admin',encoding="utf-8"))
  5. print(hash.hexdigest())

计算文件HASH值: 我们可以通过两个文件的HASH数值,来对比文件是否被修改过,常用来检测文件是否被修改.

  1. import hashlib
  2. m = hashlib.md5()
  3. with open(r'C:/lyshark.png','rb') as f:
  4. for line in f:
  5. m.update(line)
  6. print(m.hexdigest())
  7. import hashlib
  8. m = hashlib.md5()
  9. with open(r'D:/lyshark.png','rb') as f:
  10. for line in f:
  11. m.update(line)
  12. print(m.hexdigest())

Random 模块

Random模块实现了一个伪随机数生成器,可用来生成随机数以及完成与随机数相关的功能,对于整数,从范围中统一选择,对于序列,随机元素的统一选择,用于生成列表的随机排列的函数,以及用于随机抽样而无需替换的函数,下面我们来介绍下该模块下常用的几个函数.

  1. import random
  2. random.shuffle() #随机打乱列表元素排列
  3. random.randint(1,20) #生成1到20的整数包括20
  4. random.uniform(10,20) #生成10到20之间的浮点数
  5. random.randrange(1,10) #生成1到10的整数不包括10
  6. random.choice() #从序列中随机选择数据

生成随机数: 通过使用random.randint()函数,随机生成整数,字符,大小写等.

  1. >>> import random
  2. >>>
  3. >>> random.randint(1,10)
  4. 6
  5. >>> random.randint(100,9999)
  6. 1189
  7. >>> chr(random.randint(97,122)) #随机生成a-z
  8. >>> chr(random.randint(65,90)) #随机生成A-Z
  9. >>> chr(random.randint(48,57)) #随机生成0-9

随机打乱数据: 通过使用random.shuffle()函数,实现随机打乱一个列表中的数据.

  1. >>> import random
  2. >>>
  3. >>> lists = [1,2,3,4,5,6,7,8,9]
  4. >>> print(lists)
  5. [1, 2, 3, 4, 5, 6, 7, 8, 9]
  6. >>>
  7. >>> random.shuffle(lists)
  8. >>> print(lists)
  9. [4, 7, 1, 8, 3, 9, 5, 6, 2]

随机弹出数据: 通过使用random.choice()函数,实现从指定列表中随机弹出一个元素.

  1. >>> import random
  2. >>>
  3. >>> lists=[1,2,3,4,5,6,7,8,9]
  4. >>> string=["admin","guest","lyshark"]
  5. >>>
  6. >>> random.choice(lists)
  7. 2
  8. >>> random.choice(lists)
  9. 5
  10. >>>
  11. >>> random.choice(string)
  12. 'lyshark'
  13. >>> random.choice(string)
  14. 'guest'

随机生成验证码: 通过random()函数,配合循环语句,和选择语句来实现随机生成验证码.

  1. import random
  2. li = []
  3. for i in range(6):
  4. r = random.randint(0, 4)
  5. if r == 2 or r == 4:
  6. num = random.randrange(0, 10)
  7. li.append(str(num))
  8. else:
  9. temp = random.randrange(65,91)
  10. c = chr(temp)
  11. li.append(c)
  12. result = "".join(li)
  13. print(result)

Time 时间模块

Time模块是通过调用C库实现的,所以有些方法在某些平台上可能无法调用,但是其提供的大部分接口与C标准库time.h基本一致,尽管此模块始终可用,但并非所有平台上都提供所有功能,此模块中定义的大多数函数调用具有相同名称的平台C库函数,因为这些函数的语义因平台而异.

  1. import time
  2. time.sleep(4) #暂停程序执行4秒
  3. time.clock() #返回处理器时间
  4. time.process_time() #返回处理器时间
  5. time.time() #返回当前系统时间戳
  6. time.ctime() #当前系统时间,输出字符串格式化
  7. time.ctime(time.time()-86640) #将时间戳转为字符串格式
  8. time.gmtime() #获取结构化时间
  9. time.gmtime(time.time()-86640) #将时间戳转换成结构化格式
  10. time.localtime(time.time()-86640) #将时间戳转换成结构格式,但返回本地时间
  11. time.mktime(time.localtime()) #与localtime()功能相反,将结构时间转换为时间戳
  12. time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) #将struct_time格式转成指定的字符串格式
  13. time.strptime("2019-09-20","%Y-%m-%d") #将字符串格式转换成struct_time格式

DataTime 模块

DateTime模块提供了处理日期和时间的类,既有简单的方式,又有复杂的方式,它虽然支持日期和时间算法,但其实现的重点是为输出格式化和操作提供高效的属性提取功能,该模块提供了以简单和复杂的方式操作日期和时间的类,虽然支持日期和时间算法,但实现的重点是有效的属性提取,用于输出格式和操作.

  1. import datetime
  2. datetime.date.today() #格式化输出今天时间
  3. datetime.datetime.now() #格式化输出当前的时间
  4. datetime.datetime.now().timetuple() #以struct_time格式输出当前时间
  5. datetime.date.fromtimestamp(time.time()-864400) #将时间戳转成日期格式
  6. #-----------------------------------------------------------------------------------
  7. temp = datetime.datetime.now() #输出当前时间,并赋值给变量
  8. temp.replace(2019,10,10) #替换输出内容中的,年月日为2019-10-10
  9. #-----------------------------------------------------------------------------------
  10. #时间替换关键字:<[year,month,day,hour,minute,second,microsecond,tzinfo>
  11. str_to_date = datetime.datetime.strptime("19/10/05 12:30", "%y/%m/%d %H:%M") #将字符串转换成日期格式
  12. new_date = datetime.datetime.now() + datetime.timedelta(days=10) #在当前基础上加10天
  13. new_date = datetime.datetime.now() + datetime.timedelta(days=-10) #在当前基础上减10天
  14. new_date = datetime.datetime.now() + datetime.timedelta(hours=-10) #在当前基础上减10小时
  15. new_date = datetime.datetime.now() + datetime.timedelta(seconds=120) #在当前基础上加120秒

格式替换

  1. In [24]: from datetime import datetime,time,date
  2. In [25]: import pytz
  3. #查看中国时区
  4. In [26]: pytz.country_timezones('cn')
  5. Out[26]: ['Asia/Shanghai', 'Asia/Urumqi']
  6. #创建中国时区对象
  7. In [28]: tz = pytz.timezone('Asia/Shanghai')
  8. #创建时间对象时指定时区
  9. In [29]: datetime.now(tz)
  10. Out[29]: datetime.datetime(2018, 11, 16, 13, 32, 59, 744669, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
  11. #指定时区创建日期对象
  12. In [30]: datetime(2018,11,16,tzinfo=tz)
  13. Out[30]: datetime.datetime(2018, 11, 16, 0, 0, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)
  14. #指定时区创建时间对象
  15. In [31]: time(13,33,00,tzinfo=tz)
  16. Out[31]: datetime.time(13, 33, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)
  17. #本地化时间对象
  18. In [33]: tz.localize(datetime.now())
  19. Out[33]: datetime.datetime(2018, 11, 16, 13, 41, 28, 395602, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
  20. #创建本地化时间对象
  21. In [34]: loc_d = tz.localize(datetime.now())
  22. #通过本地化时间对象转化为其他时区时间
  23. In [35]: loc_d.astimezone(pytz.timezone('America/New_York'))
  24. Out[35]: datetime.datetime(2018, 11, 16, 0, 42, 43, 666067, tzinfo=<DstTzInfo 'America/New_York' EST-1 day, 19:00:00 STD>)
  25. #转换为UTC时间对象
  26. In [36]: loc_d.astimezone(pytz.utc)
  27. Out[36]: datetime.datetime(2018, 11, 16, 5, 42, 43, 666067, tzinfo=<UTC>)
  28. In [37]: loc_d
  29. Out[37]: datetime.datetime(2018, 11, 16, 13, 42, 43, 666067, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
  30. In [38]: utc_d = loc_d.astimezone(pytz.utc)
  31. In [39]: print(utc_d)
  32. 2018-11-16 05:42:43.666067+00:00
  33. #将UTC时间转换为合适的时区
  34. In [40]: later_utc = utc_d + timedelta(minutes=30)
  35. In [41]: print(later_utc.astimezone(tz))
  36. 2018-11-16 14:12:43.666067+08:00

日期互转

  1. #encode=utf-8
  2. from datetime import datetime,timedelta
  3. weekdays = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
  4. def get_previous_byday(dayname,start_date=None):
  5. if start_date is None:
  6. start_date = datetime.today() #获取当前时间
  7. day_num = start_date.weekday() #获取时间的星期
  8. day_num_target = weekdays.index(dayname) #获取查询星期
  9. days_ago = (7 + day_num - day_num_target) % 7 #获取日期差的天数
  10. if days_ago == 0:
  11. days_ago = 7
  12. target_date = start_date - timedelta(days=days_ago) #计算时间差
  13. return target_date
  14. print('现在时间:',datetime.today())
  15. print(get_previous_byday('Monday'))

Shutil 压缩模块

该shutil模块对文件和文件集合提供了许多高级操作,特别是,提供了支持文件复制和删除的功能,特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作Shutil模块也是Python中默认自带的标准库.

文件拷贝(1):/etc/passwd文件中的内容,拷贝到/tmp/passwd文件中去.

  1. >>> import shutil
  2. >>>
  3. >>> shutil.copyfileobj(open("/etc/passwd","r"),open("/tmp/passwd","w"))

文件拷贝(2):/etc/passwd文件中的内容,拷贝到/tmp/passwd文件中去,且目标文件无需存在.

  1. >>> import shutil
  2. >>>
  3. >>> shutil.copyfile("/etc/passwd","/tmp/passwd")

递归拷贝: 递归拷贝/etc目录下的所有文件,拷贝到/tmp目录下,目标目录不能存在,ignore的意思是排除.

  1. >>> import shutil
  2. >>>
  3. >>> shutil.copytree("/etc","/tmp", ignore=shutil.ignore_patterns('*.conf', 'tmp*'))

递归删除: 递归删除/etc文件夹中的所有内容.

  1. >>> import shutil
  2. >>>
  3. >>> shutil.rmtree("/etc")

文件移动: 实现文件的移动,或者是给文件重命名.

  1. >>> import shutil
  2. >>>
  3. >>> shutil.move("file1","file2")

文件归档: 实现将/etc/下的文件打包放置/home/目录下面.

  1. >>> import shutil
  2. >>>
  3. >>> ret = shutil.make_archive("/etc/","gztar",root_dir='/home/')

ZIP文件压缩: 通过ZipFile模块,压缩指定目录下的指定文件.

  1. >>> import zipfile
  2. >>>
  3. # 压缩
  4. >>> z = zipfile.ZipFile('lyshark.zip', 'w')
  5. >>> z.write('lyshark.log')
  6. >>> z.write('data.data')
  7. >>> z.close()
  8. # 解压
  9. >>> z = zipfile.ZipFile('lyshark.zip', 'r')
  10. >>> z.extractall()
  11. >>> z.close()

TAR文件压缩: 通过TarFile模块,压缩指定目录下的指定文件.

  1. >>> import tarfile
  2. >>>
  3. # 压缩
  4. >>> tar = tarfile.open('your.tar','w')
  5. >>> tar.add('/bbs2.log', arcname='bbs2.log')
  6. >>> tar.add('/cmdb.log', arcname='cmdb.log')
  7. >>> tar.close()
  8. # 解压
  9. >>> tar = tarfile.open('your.tar','r')
  10. >>> tar.extractall() # 可设置解压地址

Logging 模块

很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误、警告等信息输出,Python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging的日志可以分为debug(),info(),warning(),error(),critical(),5个级别,下面我们看一下怎么用.

如果只想把日志文件输入到显示器上,则我们可以直接执行以下操作.

  1. >>> import logging
  2. >>>
  3. >>> logging.debug("hello debug")
  4. >>> logging.warning("hello warning")
  5. >>> logging.critical("hello critical")
  6. #---输出结果-------------------------------
  7. DEBUG:root:hello debug
  8. WARNING:root:hello warning
  9. CRITICAL:root:hello critical

以上可看到logging.后面跟3个不同参数,其实除了以上三种日志等级以外,logging还支持如下几种等级:

日志等级日志数字日志信息说明
DEBUG10详细信息,通常仅在调试阶段时才有意义
INFO20确认事情按预期工作,正常工作时发送
WARNING30警告等级,表示发生了不可预料的意外
ERROR40错误,比警告等级更加严重,软件无法运行
CRITICAL50严重错误,表明程序本身可能无法继续运行

如果想把日志等级写入文件的话,只需要在程序启动时指定配置路径即可.

  1. import logging
  2. logging.basicConfig(level=logging.DEBUG,
  3. format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
  4. datefmt='%Y-%m-%d %H:%M:%S %p',
  5. filename='test.log',
  6. filemode='w')
  7. #---参数调用-------------------------------
  8. logging.debug('debug message')
  9. logging.info('info message')
  10. logging.warning('warning message')
  11. logging.error('error message')
  12. logging.critical('critical message')

日志的format()相关格式列表如下所示,以上的配置格式可以随意自定义.

格式名称格式的作用
%(name)sLogger的名字
%(levelno)s数字形式的日志级别
%(levelname)s文本形式的日志级别
%(pathname)s调用日志输出函数的模块的完整路径名
%(filename)s调用日志输出函数的模块的文件名
%(module)s调用日志输出函数的模块名
%(funcName)s调用日志输出函数的函数名
%(lineno)d调用日志输出函数的语句所在的代码行
%(created)f当前时间,用UNIX标准的表示时间
%(asctime)s字符串形式的当前时间
%(thread)d线程ID,可能没有
%(threadName)s线程名,可能没有
%(process)d进程ID,可能没有
%(message)s用户输出的消息

其实日志文件的相关功能还很多,包括多文件日志记录功能等,笔者认为这些功能太过于繁琐,在开发中容易混用,掌握上面的常用方法就已经足够,所以不再继续往下延伸了.

Process 模块

早期的Python版本中,我们主要是通过os.system()、os.popen().read()等函数来执行命令行指令的,另外还有一个很少使用的commands模块,但是从现在开始官方文档中建议使用的是subprocess模块,所以os模块和commands模块的相关函数在这里只提供一个简单的使用示例,我们重要要介绍的是subprocess模块.

使用popen执行命令: 先来演示一下os.popen()函数,来执行一条命令的过程吧.

  1. >>> import os
  2. >>>
  3. >>> temp=os.popen("ls -lh")
  4. >>> temp
  5. <open file 'ls -lh', mode 'r' at 0x7fd1d09b35d0>
  6. >>> temp.read()
  7. 'total 4.0K\n-rw-------. 1 root root 1.2K Dec 20 01:53 anaconda-ks.cfg\n'

使用call()执行命令: 接下来通过使用subprocess.call()执行一个命令,返回状态码,shell=False,第一个参数必须是列表,shell=True,第一个参数就直接输入命令即可.

  1. >>> import subprocess
  2. >>>
  3. >>> ret = subprocess.call(["ls","-lh"],shell=False)
  4. >>> print(ret)
  5. 0
  6. >>> ret = subprocess.call("ls -l", shell=True)
  7. >>> print(ret)
  8. 0

使用check_call()检查命令: 执行命令,如果执行状态码是0,则返回0,否则抛异常.

  1. >>> import subprocess
  2. >>>
  3. >>> ret = subprocess.check_call(["ls", "-l"],shell=False)
  4. >>> ret = subprocess.check_call("exit 1",shell=True)
  5. Traceback (most recent call last):
  6. File "<stdin>", line 1, in <module>
  7. File "/usr/lib64/python2.7/subprocess.py", line 542, in check_call
  8. raise CalledProcessError(retcode, cmd)
  9. subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

使用check_output()检查命令: 执行命令,如果状态码是0,则返回执行结果否则抛异常,注意这里返回的是字节类型,需要转换.

  1. >>> import subprocess
  2. >>>
  3. >>> ret = subprocess.check_output(["echo", "Hello World!"],shell=False)
  4. >>> print(str(ret,encoding='utf-8'))
  5. >>> ret = subprocess.check_output("exit 1", shell=True)
  6. >>> print(str(ret,encoding='utf-8'))

使用run()运行命令: python3.5新加的功能,代替os.system,os.spawn.

  1. >>> import subprocess
  2. >>>
  3. >>> subprocess.run(["ls", "-l"])
  4. total 56
  5. -rw-rw-r-- 1 tomcat tomcat 61 811 23:27 a.py
  6. CompletedProcess(args=['ls', '-l'], returncode=0)
  7. >>>
  8. >>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
  9. CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0, stdout=b'crw-rw-rw- 1 root root 1, 3 8\xe6\x9c\x88 11 09:27 /dev/null\n')

使用popen()命令: 此模块并非os.popen()而是在subprocess里面的一个模块,用来执行一些复杂操作.

  1. >>> import subprocess
  2. >>>
  3. >>> p = subprocess.Popen("ls -lh",shell=True,stdout=subprocess.PIPE)
  4. >>> print(p.stdout.read())

Urllib 模块

URLlib是Python提供的一个用于操作URL的模块,这个库在我们爬取网页的时候会经常用到,也是很多网站测试,网站状态检测等常用的模块之一,不过一般用来写爬虫的比较多,这里也应该了解一下它的作用.

快速抓取网页: 使用urllib最基本的抓取功能,将百度首页的内容保存到本地目录下.

  1. >>> import urllib.request
  2. >>>
  3. >>> res=urllib.request.urlopen("https://www.baidu.com")
  4. >>> print(res.read().decode("utf-8"))
  5. >>> f=open("./test.html","wb") #保存在本地
  6. >>> f.write(res.read())
  7. >>> f.close()

实现POST请求: 上述的例子是通过请求百度的get请求获得百度,下面使用urllib的post请求.

  1. >>> import urllib.parse
  2. >>> import urllib.request
  3. >>>
  4. >>> data=bytes(urllib.parse.urlencode({"hello":"lyshark"}),encoding="utf-8")
  5. >>> print(data)
  6. >>> response = urllib.request.urlopen('http://www.baidu.com/post',data=data)
  7. >>> print(response.read())

设置TIMEOUT时间: 我们需要给请求设置一个超时时间,而不是让程序一直在等待结果.

  1. import urllib.request
  2. response = urllib.request.urlopen('http://www.baidu.com', timeout=1)
  3. print(response.read())

获取网站状态: 我们可以通过status、getheaders(),getheader("server"),获取状态码以及头部信息.

  1. >>> import urllib.request
  2. >>>
  3. >>> res=urllib.request.urlopen("https://www.python.org")
  4. >>> print(type(res))
  5. <class 'http.client.HTTPResponse'>
  6. >>>
  7. >>> res.status
  8. >>> res.getheaders()
  9. >>> res.getheader("server")

伪装访问网站: 给请求添加头部信息,从而定制自己请求网站是时的头部信息,防止被和谐.

  1. from urllib import request,parse
  2. url = 'http://www.baidu.com'
  3. headers = {
  4. 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
  5. 'Host': 'mkdirs.org'
  6. }
  7. dict = {
  8. 'name': 'LyShark'
  9. }
  10. data = bytes(parse.urlencode(dict), encoding='utf8')
  11. req = request.Request(url=url, data=data, headers=headers, method='POST')
  12. response = request.urlopen(req)
  13. print(response.read().decode('utf-8'))

URL拼接功能: 我们以时候,可以拼接一个网页地址,实现下一步的访问.

  1. >>> from urllib.parse import urljoin
  2. >>>
  3. >>> urljoin("http://www.baidu.com","abuot.html")
  4. 'http://www.baidu.com/abuot.html'

Config 模块

ConfigParser模块用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section),每个节可以有多个参数(键=值),使用的配置文件的好处就是一些参数无需写死,可以使程序更灵活的配置一些参数.

为了方便演示以下的例子,请在Python所在目录创建一个test.ini配置文件,写入以下内容.

  1. [db]
  2. db_host = 127.0.0.1
  3. db_port = 69
  4. db_user = root
  5. db_pass = 123123
  6. host_port = 69
  7. [concurrent]
  8. thread = 10
  9. processor = 20

获取所有节点: 通过使用以下方式,我们可以获取到指定文件的所有主节点名称.

  1. >>> import configparser
  2. >>>
  3. >>> config=configparser.ConfigParser()
  4. >>> config.read("test.ini",encoding="utf-8")
  5. >>>
  6. >>> result=config.sections()
  7. >>> print(result)
  8. ['db', 'concurrent']

获取指定键值: 使用以下方式遍历,来获取指定节点(concurrent)下的所有键值对.

  1. >>> import configparser
  2. >>>
  3. >>> config=configparser.ConfigParser()
  4. >>> config.read("test.ini",encoding="utf-8")
  5. >>>
  6. >>> result=config.items("concurrent")
  7. >>> print(result)
  8. [('thread', '10'), ('processor', '20')]

获取指定键: 使用以下方式遍历,来获取指定节点(concurrent)下的所有的键.

  1. >>> import configparser
  2. >>>
  3. >>> config=configparser.ConfigParser()
  4. >>> config.read("test.ini",encoding="utf-8")
  5. >>>
  6. >>> result=config.options("concurrent")
  7. >>> print(result)
  8. ['thread', 'processor']

获取指定值: 使用以下方式遍历,来获取指定节点下指定键的对应值.

  1. >>> import configparser
  2. >>>
  3. >>> config=configparser.ConfigParser()
  4. >>> config.read("test.ini",encoding="utf-8")
  5. >>>
  6. >>> result=config.get("concurrent","thread")
  7. # result = config.getint("concurrent","thread")
  8. # result = config.getfloat("concurrent","thread")
  9. # result = config.getboolean("concurrent","thread")
  10. >>> print(result)
  11. 10

检查&添加&删除主节点: 检查、添加、删除指定的主节点数据.

  1. >>> import configparser
  2. >>>
  3. >>> config=configparser.ConfigParser()
  4. >>> config.read("test.ini",encoding="utf-8")
  5. #--检查主节点---------------------------------------------
  6. >>> has_sec=config.has_section("db")
  7. >>> print(has_sec)
  8. True
  9. #--添加主节点---------------------------------------------
  10. >>> config.add_section("lyshark")
  11. >>> config.write(open("test.ini","w"))
  12. #--删除主节点---------------------------------------------
  13. >>> config.remove_section("lyshark")
  14. True
  15. >>> config.write(open("test.ini","w"))

检查&添加&删除指定键值对: 检查、删除、设置指定组内的键值对.

  1. >>> import configparser
  2. >>>
  3. >>> config=configparser.ConfigParser()
  4. >>> config.read("test.ini",encoding="utf-8")
  5. #--检查节点中的键值对--------------------------------------
  6. >>> has_opt=config.has_option("db","db_host")
  7. >>> print(has_opt)
  8. True
  9. #--设置节点中的键值对--------------------------------------
  10. >>> config.set("test.ini","db_host","8888888888")
  11. >>> config.write(open("test.ini","w"))
  12. #--删除节点中的键值对--------------------------------------
  13. >>> config.remove_option("db","db_host")
  14. True
  15. >>> config.write(open("test.ini","w"))

JSON 模块

JSON(JavaScript Object Notation),是一种轻量级的数据交换格式,它基于 ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据,简洁和清晰的层次结构使得JSON成为理想的数据交换语言,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率,JSON实现了字符串和编程语言之间的数据共享与交互,通用各种编程语言中,JSON模块提供了四个功能:dumps、dump、loads、load下面将详细介绍它的应用场景.

dumps(): 将Python的基本数据类型转化成字符串形式.

  1. >>> import json
  2. >>>
  3. >>> dic={"admin":"123","lyshark":"123123"}
  4. >>>
  5. >>> print(dic,type(dic))
  6. {'admin': '123', 'lyshark': '123123'} <class 'dict'>
  7. >>>
  8. >>> result=json.dumps(dic)
  9. >>> print(result,type(result))
  10. {"admin": "123", "lyshark": "123123"} <class 'str'>

loads(): 将Python字符串形式转化成基本数据类型.

  1. >>> import json
  2. >>>
  3. >>> string='{"key":"value"}'
  4. >>> print(string,type(string))
  5. {"key":"value"} <class 'str'>
  6. >>> dic=json.loads(string)
  7. >>> print(dic,type(dic))
  8. {'key': 'value'} <class 'dict'>

dump(): 先将指定数据序列化,然后再写入文件中,持久化存储,一步到位.

  1. >>> import json
  2. >>>
  3. >>> lists=[1,2,3,4,5,6,7,8,9,10]
  4. >>> lists
  5. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  6. >>>
  7. >>> json.dump(lists,open("db.json","w",encoding="utf-8"))
  8. >>> f=open("db.json","w")
  9. >>> json.dump(lists,f)

load(): 读取一个序列文件,将其中的内容加载,反序列化到程序中.

  1. >>> import json
  2. >>>
  3. >>> lists=json.load(open("db.json","r",encoding="utf-8"))
  4. >>> lists
  5. '{"admin": "123123", "guest": "456789"}'

XML 模块

XML可扩展标记语言,XML的宗旨传输数据的,XML是实现不同语言或程序之间进行数据交换的协议,XML是目前数据交换的唯一公共语言,跟json差不多,但json使用起来更简单,不过,在json还没诞生的黑暗年代,大家只能选择用xml,至今很多传统公司如金融行业的很多系统的接口还主要是XML作为数据通信接口,如下我们就来学习一下这个模块的使用吧.

为了方便演示后续内容,请自行在Python当前目录下创建lyshark.xml以下XML文档.

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <data>
  3. <country name="Liechtenstein">
  4. <rank updated="yes">2</rank>
  5. <year>2019</year>
  6. <gdppc>141100</gdppc>
  7. <neighbor direction="E" name="Austria" />
  8. <neighbor direction="W" name="Switzerland" />
  9. </country>
  10. <country name="Singapore">
  11. <rank updated="yes">5</rank>
  12. <year>2020</year>
  13. <gdppc>59900</gdppc>
  14. <neighbor direction="N" name="Malaysia" />
  15. </country>
  16. <country name="Panama">
  17. <rank updated="yes">69</rank>
  18. <year>2029</year>
  19. <gdppc>13600</gdppc>
  20. <neighbor direction="W" name="Costa Rica" />
  21. <neighbor direction="E" name="Colombia" />
  22. </country>
  23. </data>

创建XML文档: 通过使用XML函数,创建一个XML文档,原生保存的XML时默认无缩进.

  1. <root>
  2. <son name="1号儿子">
  3. <grand name="1号孙子"></grand>
  4. </son>
  5. <son name="2号儿子">
  6. <grand name="2号孙子"></grand>
  7. </son>
  8. </root>
  9. #--以下代码则可创建如上格式-------------------------------------------------
  10. >>> import xml.etree.ElementTree as ET
  11. >>>
  12. >>> root=ET.Element("root")
  13. >>>
  14. >>> son1=ET.Element("son",{"name":"1号儿子"})
  15. >>> son2=ET.Element("son",{"name":"2号儿子"})
  16. >>>
  17. >>> grand1=ET.Element("grand",{"name":"1号孙子"})
  18. >>> grand2=ET.Element("grand",{"name":"2号孙子"})
  19. >>>
  20. >>> son1.append(grand1)
  21. >>> son2.append(grand2)
  22. >>>
  23. >>> root.append(son1)
  24. >>> root.append(son2)
  25. >>>
  26. >>> tree=ET.ElementTree(root)
  27. >>> tree.write('lyshark.xml',encoding='utf-8',short_empty_elements=False)

打开XML文档: 通过使用xml.etree.ElementTree,来实现打开要XML文件.

  1. >>> import xml.etree.ElementTree as ET
  2. >>>
  3. >>> tree = ET.parse("lyshark.xml")
  4. >>> root = tree.getroot()
  5. >>> print(root.tag)

遍历XML文档(单层): 通过使用循环的方式,来实现对XML文件子树的遍历.

  1. >>> import xml.etree.ElementTree as ET
  2. >>>
  3. >>> tree=ET.parse("lyshark.xml")
  4. >>> root=tree.getroot()
  5. >>>
  6. >>> for child in root:
  7. ... print(child.tag,child.attrib)
  8. ...
  9. country {'name': 'Liechtenstein'}
  10. country {'name': 'Singapore'}
  11. country {'name': 'Panama'}

遍历XML文档(多层): 通过使用循环的方式遍历root下面的目录,来实现对XML文件子树的子树进行遍历.

  1. >>> import xml.etree.ElementTree as ET
  2. >>>
  3. >>> tree=ET.parse("lyshark.xml")
  4. >>> root=tree.getroot()
  5. >>> # 遍历XML文档的第二层
  6. >>> for x in root:
  7. # 第二层节点的标签名称和标签属性
  8. ... print("主目录: %s"%x.tag)
  9. # 遍历XML文档的第三层
  10. ... for y in x:
  11. # 第三层节点的标签名称和内容
  12. ... print(y.tag,y.attrib,y.text)
  13. ...
  14. 主目录: country
  15. rank {'updated': 'yes'}
  16. year {}
  17. gdppc {}
  18. neighbor {'direction': 'E', 'name': 'Austria'}
  19. neighbor {'direction': 'W', 'name': 'Switzerland'}
  20. 主目录: country
  21. rank {'updated': 'yes'}
  22. year {}
  23. gdppc {}
  24. neighbor {'direction': 'N', 'name': 'Malaysia'}
  25. 主目录: country
  26. rank {'updated': 'yes'}
  27. year {}
  28. gdppc {}
  29. neighbor {'direction': 'W', 'name': 'Costa Rica'}
  30. neighbor {'direction': 'E', 'name': 'Colombia'}

遍历指定节点: 通过循环的方式,配合root.iter()来实现只遍历XML文档中的year节点.

  1. >>> import xml.etree.ElementTree as ET
  2. >>>
  3. >>> tree=ET.parse("lyshark.xml")
  4. >>> root=tree.getroot()
  5. >>>
  6. >>> for node in root.iter("year"):
  7. ... print(node.tag,node.text)
  8. ...
  9. year 2019
  10. year 2020
  11. year 2029

修改XML字段: 通过遍历的方式,找到节点为year的数据行,并将其内容自动加1,并会写到XML文档.

  1. >>> import xml.etree.ElementTree as ET
  2. >>>
  3. >>> tree=ET.parse("lyshark.xml")
  4. >>> root=tree.getroot()
  5. >>>
  6. >>> for node in root.iter("year"): #遍历并修改每个字段内容
  7. ... new_year=int(node.text) + 1 #先将node.text变成整数,实现加法
  8. ... node.text=str(new_year) #然后变成字符串,复制给内存中的text
  9. ... node.set("updated","yes") #在每个year字段上加上一段属性,updated=yes
  10. ...
  11. >>> tree.write("lyshark.xml") #回写到配置文件中,覆盖成最新的数据
  12. >>> del node.attrib["name"] #删除节点中的指定属性字段

删除XML字段: 通过遍历的方式,查找所有的country节点,并判断如果内部rank>50则删除这个country节点.

  1. >>> import xml.etree.ElementTree as ET
  2. >>>
  3. >>> tree=ET.parse("lyshark.xml")
  4. >>> root=tree.getroot()
  5. >>> # 遍历data下的所有country节点
  6. >>> for country in root.findall("country"):
  7. # 获取每一个country节点下rank节点的内容
  8. ... rank=int(country.find("rank").text)
  9. ... if rank > 50:
  10. # 删除指定country节点
  11. ... root.remove(country)
  12. ...
  13. >>> tree.write("output.xml",encoding="utf-8")

RabbitMQ 模块

RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统,他遵循Mozilla Public License开源协议,MQ全称为Message Queue,消息队列(MQ)是一种应用程序对应用程序的通信方法,应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术.排队指的是应用程序通过队列来通信,队列的使用除去了接收和发送应用程序同时执行的要求,说的笼统点是queue+socket实现.

◆MQ的基础应用◆

如果启动了多个消费者,那么他们之间是串行获取数据的,也就是说如果1号消费者收不到数据,那么MQ将默认发送给2号消费者,以此类推,如果全部消费者不在线,那么MQ会默认存储这个消息,直到有消费者上线,MQ就会将消息发送给指定的消费者.

生产者:

  1. import pika
  2. conn = pika.BlockingConnection(pika.ConnectionParameters
  3. (host="192.168.1.5",port="5672") #指定连接地址
  4. )
  5. print("链接消息:",conn)
  6. channel = conn.channel()
  7. channel.queue_declare(queue="lyshark")
  8. while True:
  9. temp =input("发送数据:").strip()
  10. channel.basic_publish(exchange="",routing_key="lyshark",body=temp)
  11. conn.close()

消费者:

  1. import pika
  2. connection = pika.BlockingConnection(pika.ConnectionParameters
  3. (host='192.168.1.5',port="5672")
  4. )
  5. channel = connection.channel()
  6. channel.queue_declare(queue='lyshark')
  7. def callback(ch,method,properties,body):
  8. print("接收的数据: %r" %body)
  9. channel.basic_consume(callback, #消息来到后,调用callback回调函数.
  10. queue='lyshark', #指定消息队列名称
  11. no_ack=True) # 如果=True,则消息发送中间中断后会自动保存下来.
  12. # 下一次客户端上线后会自动的接受消息
  13. print("==========准备接收消息==========")
  14. channel.start_consuming() #循环接收消息

◆消息的持久化◆

如果服务器端被强制关闭了,我们的消息就丢失了,那就需要我们对服务器端的数据做一个持久化处理.

在每次声明队列的时候加上durable=True 队列持久化,delivery_mode =2 消息持久化
也就是开启持久化的意思,必须客户端服务端都要写上.

生产者:

  1. import pika
  2. connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.1.5'))
  3. channel = connection.channel()
  4. channel.queue_declare(queue='hello', durable=True)
  5. channel.basic_publish(exchange='',
  6. routing_key='hello',
  7. body='Hello World!',
  8. properties=pika.BasicProperties(delivery_mode=2, )) # 发布时设置delivery_mode=2,数据持久化
  9. print(" [x] Sent 'Hello World!'")
  10. connection.close()

消费者:

  1. import pika
  2. connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.1.5'))
  3. channel = connection.channel()
  4. channel.queue_declare(queue='hello', durable=True)
  5. def callback(ch, method, properties, body):
  6. print("返回数据: %r" % body)
  7. import time
  8. #time.sleep(10)
  9. print("完成...")
  10. ch.basic_ack(delivery_tag=method.delivery_tag)
  11. channel.basic_consume(callback,
  12. queue='hello',
  13. no_ack=False)
  14. print(' [*] Waiting for messages. To exit press CTRL+C')
  15. channel.start_consuming()

◆消息发布订阅◆

如上的配置方式,MQ只能将消息发送给一个消费者手里,有时候我们想给所有的消费者发送消息,那就需要使用广播的方式给所有的客户端发送消息的分发,MQ支持消息的公平分发,之前的例子都基本都是1对1的消息发送和接收,即消息只能发送到指定的queue里,但有些时候你想让你的消息被所有的Queue收到,类似广播的效果,这时候就要用到exchange了,exchange在定义的时候是有类型的,以决定到底是哪些Queue符合条件,可以接收消息.

发布者(fanout广播模式): 指定发布者为广播模式,所有bind到此exchange的queue都可以接收到服务端发送的消息.

  1. import pika
  2. connection = pika.BlockingConnection(pika.ConnectionParameters(host="192.168.1.5"))
  3. channel = connection.channel()
  4. channel.exchange_declare(exchange="logs",
  5. exchange_type="fanout" #指定使用广播模式
  6. )
  7. message = "info:hello lyshark" #指定发送的消息
  8. channel.basic_publish(exchange="logs",
  9. routing_key="", #不绑定队列,因为是广播模式
  10. body = message #要发送的消息
  11. )
  12. print("发送消息: %r"%message)
  13. connection.close()

订阅者(fanout广播模式): 订阅者修改让其随机生成队列名称,你可以启动多个订阅者来看其执行效果.

  1. import pika
  2. connection = pika.BlockingConnection(pika.ConnectionParameters(host="192.168.1.5"))
  3. channel = connection.channel()
  4. channel.exchange_declare(exchange="logs",exchange_type="fanout") #指定为广播模式
  5. result = channel.queue_declare(exclusive=True) #不指定queue名字,rabbit会随机分配一个名字
  6. queue_name = result.method.queue #返回这个随机生成的名字.
  7. channel.queue_bind(exchange="logs",queue=queue_name) #绑定随机生成的名字
  8. print("==========接收数据==========")
  9. def callback(ch, method, properties, body):
  10. print("收到的数据: %r" %body)
  11. channel.basic_consume(callback,queue=queue_name,no_ack=True)
  12. channel.start_consuming()

◆选择发布订阅◆

RabbitMQ还支持根据关键字发送,即:队列绑定关键字,发送者将数据根据关键字发送到消息exchange,exchange根据关键字判定应该将数据发送至指定队列,direct模式通过routingKey和exchange决定的那个唯一的queue可以接收消息.

发布者(direct模式):

  1. import pika
  2. import sys
  3. connection = pika.BlockingConnection(pika.ConnectionParameters(
  4. host='localhost'))
  5. channel = connection.channel()
  6. channel.exchange_declare(exchange='direct_logs',
  7. type='direct')
  8. severity = sys.argv[1] if len(sys.argv) > 1 else 'info'
  9. message = ' '.join(sys.argv[2:]) or 'Hello World!'
  10. channel.basic_publish(exchange='direct_logs',
  11. routing_key=severity,
  12. body=message)
  13. print(" [x] Sent %r:%r" % (severity, message))
  14. connection.close()

发布者(direct模式):

  1. import pika
  2. import sys
  3. connection = pika.BlockingConnection(pika.ConnectionParameters(
  4. host='localhost'))
  5. channel = connection.channel()
  6. channel.exchange_declare(exchange='direct_logs',
  7. type='direct')
  8. result = channel.queue_declare(exclusive=True)
  9. queue_name = result.method.queue
  10. severities = sys.argv[1:]
  11. if not severities:
  12. sys.stderr.write("Usage: %s [info] [warning] [error]\n" % sys.argv[0])
  13. sys.exit(1)
  14. for severity in severities:
  15. channel.queue_bind(exchange='direct_logs',
  16. queue=queue_name,
  17. routing_key=severity)
  18. print(' [*] Waiting for logs. To exit press CTRL+C')
  19. def callback(ch, method, properties, body):
  20. print(" [x] %r:%r" % (method.routing_key, body))
  21. channel.basic_consume(callback,
  22. queue=queue_name,
  23. no_ack=True)
  24. channel.start_consuming()

Paramiko 模块

paramiko 是一个用于做远程SSH控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实,其实它的底层是对ssh的上层代码的一个封装,值得注意的是,由于paramiko模块内部依赖pycrypto,所以先下载安装pycrypto模块.

◆基于密码认证◆

SSHClient:

  1. import paramiko
  2. # 创建SSH对象
  3. ssh = paramiko.SSHClient()
  4. # 允许连接不在know_hosts文件中的主机
  5. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  6. # 连接服务器
  7. ssh.connect(hostname='192.168.1.5',port=22,username='root',password='1233')
  8. # 执行命令
  9. stdin,stdout,stderr = ssh.exec_command('ls -lh')
  10. # 获取命令结果
  11. result = stdout.read()
  12. # 关闭连接
  13. ssh.close()

Transport:

  1. import paramiko
  2. transport = paramiko.Transport(('192.168.1.5',22))
  3. transport.connect(username='root',password='1233')
  4. ssh = paramiko.SSHClient()
  5. ssh._transport = transport
  6. stdin, stdout, stderr = ssh.exec_command('ls -lh')
  7. print stdout.read()
  8. transport.close()

◆基于公钥认证◆

SSHClient:

  1. import paramiko
  2. private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
  3. # 创建SSH对象
  4. ssh = paramiko.SSHClient()
  5. # 允许连接不在know_hosts文件中的主机
  6. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  7. # 连接服务器
  8. ssh.connect(hostname='192.168.1.5',port=22,username='root',key=private_key)
  9. # 执行命令
  10. stdin,stdout,stderr = ssh.exec_command('ls -lh')
  11. # 获取命令结果
  12. result = stdout.read()
  13. # 关闭连接
  14. ssh.close()

Transport:

  1. import paramiko
  2. private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
  3. transport = paramiko.Transport(('192.168.1.5',22))
  4. transport.connect(username='root',pkey=private_key)
  5. ssh = paramiko.SSHClient()
  6. ssh._transport = transport
  7. stdin,stdout,stderr = ssh.exec_command('ls -lh')
  8. transport.close()

◆远程传输文件◆

SFTPClient:

  1. import paramiko
  2. transport = paramiko.Transport(('192.168.1.5',22))
  3. transport.connect(username='root',password='1233')
  4. sftp = paramiko.SFTPClient.from_transport(transport)
  5. # 将目录下的location.py 上传至服务器 /tmp/lyshark.py
  6. sftp.put('./location.py', '/tmp/lyshark.py')
  7. # 将remove_path 下载到本地 local_path
  8. sftp.get('remove_path','local_path')
  9. transport.close()

SFTPTransport:

  1. import paramiko
  2. private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
  3. transport = paramiko.Transport(('192.168.1.5', 22))
  4. transport.connect(username='root', pkey=private_key )
  5. sftp = paramiko.SFTPClient.from_transport(transport)
  6. # 将location.py 上传至服务器 /tmp/test.py
  7. sftp.put('/tmp/location.py', '/tmp/test.py')
  8. # 将remove_path 下载到本地 local_path
  9. sftp.get('remove_path', 'local_path')
  10. transport.close()
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/52601
推荐阅读
相关标签
  

闽ICP备14008679号