一、模块的定义:
本质就是一个.py结尾的python文件,用来从逻辑上组织python代码(变量、函数、类、逻辑),去实现某一个功能
包:package
用来从逻辑上组织模块,本质就是一个目录(必须带有__init__.py
二、使用方法:
定义模块:
name = 'ykyk'
def say_hi():
print('Hello ykyk')使用模块:import modules_test/from modules_test import * (不建议用第二种方法)from modules_test import say_hi as say_hellofrom modules_test import m1,m2,m3
print(modules_test.name)
modules_test.say_hi()
三、import的本质:
把python文件解释一遍
imort 包的本质
执行该package下的__init__.py文件
四、导入优化
from module_test import test 需要重复调用直接导入,不要重复调用
五、模块的分类
1.标准库
2.开源模块
3.自定义模块
1)时间模块
在Python中,通常有三种方式来表示时间,(1)时间戳,(2)格式化的时间字符串,(3)元组(struct_time) 共九个元素
print(time.time())print(time.sleep(2)print(time.gmtime()) UTC时区print(time.localtime()) 本地时区x = time.localtime()
print(x.tm_year)y = time.localtime(435345223)获取具体的哪一天
print(y.tm_yday)print(time.mktime(x))从元组转换成秒print(time.strftime("%Y-%m-%d %H-%M-%S",x)) 元组转字符串z = time.strptime('2018-03-10 14-06-46',"%Y-%m-%d %H-%M-%S") 将格式化的字符串转换成tuple形式 注意时间位置必须确定time.struct_time(tm_year=2018, tm_mon=3, tm_mday=10, tm_hour=14, tm_min=6, tm_sec=46, tm_wday=5, tm_yday=69, tm_isdst=-1)x = time.localtime()print(x)
print(time.asctime(x)) 转换tuple到转换成格式化时间 接收的是元组输出:time.struct_time(tm_year=2018, tm_mon=3, tm_mday=10, tm_hour=14, tm_min=14, tm_sec=18, tm_wday=5, tm_yday=69, tm_isdst=0)
Sat Mar 10 14:14:18 2018
print(time.ctime()) 接收的是时间戳Sat Mar 10 14:16:36 2018import datetime
print(datetime.datetime.now())
print(datetime.datetime.now()+datetime.timedelta(3))
print(datetime.datetime.now()+datetime.timedelta(-3))
print(datetime.datetime.now()+datetime.timedelta(hours=3))
2)random模块
>>> import random
>>> random.random()
0.4192996054436051
>>> random.randint(1,3)
1
>>> random.randint(1,3)
1
>>> random.randint(1,3)
2
>>> random.randint(1,3)
1
>>> random.randint(1,3)
3
>>> random.randint(1,3)3
>>> random.randrange(1,3)
1
>>> random.randrange(1,3)
2
>>> random.randrange(1,3)
2
>>> random.randrange(1,3)
1
>>> random.randrange(1,3)
1
>>> random.randrange(1,3)
1顾头不顾尾
>>> random.choice('hello')
'l'>>> random.choice('hello')
'h'
验证码生成式:
import random
checkcode = ''
for i in range(4):
current = random.randrange(0,4)
if current == i :
tmp = chr(random.randint(65,90))
else :
tmp = random.randint(0,9)
checkcode += str(tmp)
print(checkcode)
3)OS模块
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir(
"dirname"
) 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: (
'.'
)
os.pardir 获取当前目录的父目录字符串名:(
'..'
)
os.makedirs(
'dirname1/dirname2'
) 可生成多层递归目录
os.removedirs(
'dirname1'
) 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir(
'dirname'
) 生成单级目录;相当于shell中mkdir dirname
os.rmdir(
'dirname'
) 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir(
'dirname'
) 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename(
"oldname"
,
"newname"
) 重命名文件
/
目录
os.stat(
'path/filename'
) 获取文件
/
目录信息
os.sep 输出操作系统特定的路径分隔符,win下为
"\\",Linux下为"
/
"
os.linesep 输出当前平台使用的行终止符,win下为
"\t\n"
,Linux下为
"\n"
os.pathsep 输出用于分割文件路径的字符串
os.name 输出字符串指示当前使用平台。win
-
>
'nt'
; Linux
-
>
'posix'
os.system(
"bash command"
) 运行shell命令,直接显示
os.environ 获取系统环境变量
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成目录和文件名二元组返回
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) 如果path存在,返回
True
;如果path不存在,返回
False
os.path.isabs(path) 如果path是绝对路径,返回
True
os.path.isfile(path) 如果path是一个存在的文件,返回
True
。否则返回
False
os.path.isdir(path) 如果path是一个存在的目录,则返回
True
。否则返回
False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
4)sys模块
sys.argv 命令行参数
List
,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(
0
)
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的
Int
值
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.stdout.write(
'please:'
)
val
=
sys.stdin.readline()[:
-
1
]
5)shutil模块
shutil模块是一个高级的文件、文件夹、压缩包处理模块
1.shutil.copyfileobj(fsrc,fdst[,length])讲一个文件的内容覆盖拷贝给另一个
将文件内容拷贝到另一个文件中,可以只拷贝部分内容
[root@mysql practise]# echo 1 > ykyk
[root@mysql practise]# cat ykyk
1
[root@mysql practise]# touch tina
>>> f1 = open('ykyk',encoding='utf-8')
>>> f2 = open('tina','w',encoding='utf-8')
>>> shutil.copyfileobj(f1,f2)
>>> f2.close()[root@mysql practise]# cat tina
1
2.shutil.copyfile(src,dst) 拷贝文件,不用打开文件
>>> shutil.copyfile('ykyk','ykyk11')
'ykyk11'
3.shutil.copymode(src, dst)仅拷贝权限,内容、组、用户不变
su - ykyk
touch test_mode
ll test_mode
-rw-rw-r-- 1 ykyk ykyk 0 Mar 10 06:17 test_modesu - root
[root@mysql practise]# touch test_mode1
[root@mysql practise]# ll test_mode1
-rw-r--r-- 1 root root 0 Mar 10 06:18 test_mode1[root@mysql practise]# chmod 750 test_mode
[root@mysql practise]# ll test_mode
-rwxr-x--- 1 ykyk ykyk 0 Mar 10 06:17 test_mode>>> shutil.copymode('test_mode','test_mode1')
[root@mysql practise]# ll test_mode1
-rwxr-x--- 1 root root 0 Mar 10 06:18 test_mode1
4.shutil.copystat(src,dst) 拷贝状态信息,包括mode bits,atime,mtime,flags
[root@mysql practise]# stat test_mode
File: `test_mode'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 1971061 Links: 1
Access: (0750/-rwxr-x---) Uid: ( 500/ ykyk) Gid: ( 500/ ykyk)
Access: 2018-03-10 06:17:07.275255135 +0800
Modify: 2018-03-10 06:17:07.275255135 +0800
Change: 2018-03-10 06:19:53.335255225 +0800
[root@mysql practise]# touch test_stat
[root@mysql practise]# stat !$
stat test_stat
File: `test_stat'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 1971063 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-03-10 06:22:38.663256606 +0800
Modify: 2018-03-10 06:22:38.663256606 +0800
Change: 2018-03-10 06:22:38.663256606 +0800
>>> shutil.copystat('test_mode','test_stat')
[root@mysql practise]# stat test_stat
File: `test_stat'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 1971063 Links: 1
Access: (0750/-rwxr-x---) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-03-10 06:17:07.275255135 +0800
Modify: 2018-03-10 06:17:07.275255135 +0800
Change: 2018-03-10 06:23:12.716254963 +0800可以看到atime、mtime都和test_mode 一样了
5.shutil.copy(src,dst) 拷贝文件和权限
[root@mysql practise]# touch test_copy
[root@mysql practise]# ll !$
ll test_copy
-rw-r--r-- 1 root root 0 Mar 10 06:26 test_copy
>>> shutil.copy('test_mode','test_copy')
'test_copy'
[root@mysql practise]# ll test_copy
-rwxr-x--- 1 root root 0 Mar 10 06:26 test_copy
6.shutil.copy2(src.dst)拷贝文件和状态信息
>>> shutil.copy('test_mode','test_copy2')
'test_copy2'
[root@mysql practise]# ll test_copy2
-rwxr-x--- 1 root root 0 Mar 10 06:30 test_copy2
7.shutil.copytree(src,dst,symlink=False,ignore=None)递归的去拷贝文件
>>> shutil.copytree('/etc', '/test/practise/test_copytree')
'/test/practise/test_copytree'
[root@mysql practise]# cd test_copytree/
[root@mysql test_copytree]# ll
total 1404…….
8.shutil.rmtree(path[,ignore_errors[,onerror]])递归的去删除文件,最后一级必须是目录
[root@mysql vars]# ls
infra
[root@mysql vars]# pwd
/test/practise/test_copytree/yum/vars
>>> shutil.rmtree('/test/practise/test_copytree/yum/vars/')
[root@mysql vars]# ll
total 0
9.shutil.move(src,dst)
[root@mysql yum]# ls
pluginconf.d protected.d version-groups.conf[root@mysql yum]# pwd
/test/practise/test_copytree/yum>>> shutil.move('/test/practise/test_copytree/yum/version-groups.conf','/test/practise/')
'/test/practise/version-groups.conf'[root@mysql practise]# ls version-groups.conf
version-groups.conf[root@mysql practise]# pwd
/test/practise
10.shutil.make_archive():可以压缩,打包文件
>>> shutil.make_archive('/test/practise/test_copytree/yum/protected.d','gztar','/test/practise')
'/test/practise/test_copytree/yum/protected.d.tar.gz'[root@mysql yum]# ll -h
total 50M
drwxr-xr-x. 2 root root 4.0K Mar 22 2017 pluginconf.d
drwxr-xr-x. 2 root root 4.0K Mar 22 2017 protected.d
-rw-r--r-- 1 root root 50M Mar 10 08:33 protected.d.tar.gz
shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:
zipfile:
import zipfile # 压缩 z = zipfile.ZipFile('laxi.zip', 'w') z.write('a.log') z.write('data.data') z.close() # 解压 z = zipfile.ZipFile('laxi.zip', 'r') z.extractall() z.close()
tarfile:
import tarfile # 压缩 tar = tarfile.open('your.tar','w') tar.add('/Users/wupeiqi/PycharmProjects/bbs2.zip', arcname='bbs2.zip') tar.add('/Users/wupeiqi/PycharmProjects/cmdb.zip', arcname='cmdb.zip') tar.close() # 解压 tar = tarfile.open('your.tar','r') tar.extractall() # 可设置解压地址 tar.close()
6)configparser:
这个模块是用来对于特定的文件进行操作
样例文件:
[client]
port = 3306
socket = /data/mysql/3306/run/mysql.socket
[mysqld]
user = mysql
port = 3306
socket = /data/mysql/3306/run/mysql.socket
pid-file = /data/mysql/3306/run/mysql.pid
datadir = /data/mysql/3306/data
general_log_file = /data/mysql/3306/log/mysql-access.log
log-error = /data/mysql/3306/log/mysql-error.log
expire_logs_days = 3
lower_case_table_names = 0
skip-external-locking
query_cache_type = 1
query_cache_size = 128M
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
tmpdir = /data/mysql/3306/tmp
slave-load-tmpdir = /data/mysql/3306/tmp
tmp_table_size = 32M
max_heap_table_size = 32
max_connections = 2000
replicate-wild-ignore-table = mysql.%
replicate-wild-ignore-table = information_schema.%
replicate-wild-ignore-table = performance_schema.%
innodb_data_home_dir = /data/mysql/3306/innodb
innodb_data_file_path = ibdata1:512M:autoextend
innodb_log_group_home_dir = /data/mysql/3306/innodb
innodb_log_file_size = 512M
innodb_log_files_in_group = 2
relay-log = /data/mysql/3306/relay-log/slave_relay_bin
relay-log-index = slave_relay_bin.index
log-slave-updates
binlog_format = row
server-id = 3306
log-bin = /data/mysql/3306/binlog/binlog
log-bin-index = binlog.index
innodb_log_buffer_size = 16M
用法:
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config.read('my.cnf')
['my.cnf']读
>>> secs = config.sections()
>>> print(secs)
['client', 'mysqld']>>> optioins = config.options('mysqld')
>>> print(optioins)
['user', 'port', 'socket', 'pid-file', 'datadir', 'general_log_file', 'log-error', 'expire_logs_days', 'lower_case_table_names', 'query_cache_type', 'query_cache_size', 'key_buffer_size', 'max_allowed_packet', 'table_open_cache', 'sort_buffer_size', 'net_buffer_length', 'read_buffer_size', 'read_rnd_buffer_size', 'myisam_sort_buffer_size', 'tmpdir', 'slave-load-tmpdir', 'tmp_table_size', 'max_heap_table_size', 'max_connections', 'replicate-wild-ignore-table', 'innodb_data_home_dir', 'innodb_data_file_path', 'innodb_log_group_home_dir', 'innodb_log_file_size', 'innodb_log_files_in_group', 'relay-log', 'relay-log-index', 'binlog_format', 'server-id', 'log-bin', 'log-bin-index', 'innodb_log_buffer_size']
>>> item_list = config.items('client')
>>> print(item_list)
[('port', '3306'), ('socket', '/data/mysql/3306/run/mysql.socket')]
>>> val = config.get('client','port')
>>> print(val)
3306>>> val2 = config.getint('client','port')
>>> print(val2)
3306
>>> sec = config.remove_section('client')
>>> config.write(open('my.cnf','w'))
>>> secs = config.sections()
>>> print(secs)
['mysqld']
>>> sec = config.has_section('ykyk')
>>> sec = config.add_section('ykyk')
>>> config.write(open('my.cnf','w'))
>>> sec = config.sections()
>>> print(sec)
['mysqld', 'ykyk']
>>> config.set('ykyk','y1','12345')
>>> config.write(open('my.cnf','w'))>>> item_list = config.items('ykyk')
>>> print(item_list)
[('y1', '12345')]
>>> config.remove_option('ykyk','12345')
False
>>> config.write(open('my.cnf','w'))
>>> item_list = config.items('ykyk')
>>> print(item_list)
[('y1', '12345')]
>>> config.remove_option('ykyk','y1')
True
>>> config.write(open('my.cnf','w'))
>>> item_list = config.items('ykyk')
>>> print(item_list)
[]
7)subprocess
subprocess 是python2.4中新增的一个模块,它允许你生成新的进程,连接到他们的input/output/error管道,并获取他们的状态返回码。
用法:
1.subprocess.run()
执行指定的命令,等待命令执行完成后返回一个包含执行结果的CompletesProcess类的实例。
subprocess.CompletedProcess类介绍
需要说明的是,subprocess.run()函数是Python3.5中新增的一个高级函数,其返回值是一个subprocess.CompletedPorcess类的实例,因此,subprocess.completedPorcess类也是Python 3.5中才存在的。它表示的是一个已结束进程的状态信息,它所包含的属性如下:
- args: 用于加载该进程的参数,这可能是一个列表或一个字符串
- returncode: 子进程的退出状态码。通常情况下,退出状态码为0则表示进程成功运行了;一个负值-N表示这个子进程被信号N终止了
- stdout: 从子进程捕获的stdout。这通常是一个字节序列,如果run()函数被调用时指定universal_newlines=True,则该属性值是一个字符串。如果run()函数被调用时指定stderr=subprocess.STDOUT,那么stdout和stderr将会被整合到这一个属性中,且stderr将会为None
- stderr: 从子进程捕获的stderr。它的值与stdout一样,是一个字节序列或一个字符串。如果stderr灭有被捕获的话,它的值就为None
- check_returncode(): 如果returncode是一个非0值,则该方法会抛出一个CalledProcessError异常。
>>> subprocess.run(['ls','-l'])
total 16632
-rw-r--r-- 1 root root 479 Mar 10 04:06 install.sh
-rw-r--r-- 1 root root 1169 Mar 10 09:11 my.cnf
drwxr-xr-x 16 501 501 4096 Mar 10 04:09 Python-3.6.4
-rw-r--r-- 1 root root 16992824 Dec 19 13:37 Python-3.6.4.tar.xz
-rw-r--r-- 1 root root 236 Mar 10 03:49 randomnum.py
-rwxr-x--- 1 root root 0 Mar 10 06:26 test_copy
-rwxr-x--- 1 root root 0 Mar 10 06:30 test_copy2
drwxr-xr-x. 79 root root 4096 Mar 10 06:16 test_copytree
-rwxr-x--- 1 ykyk ykyk 0 Mar 10 06:17 test_mode
-rwxr-x--- 1 root root 0 Mar 10 06:18 test_mode1
-rwxr-x--- 1 root root 0 Mar 10 06:17 test_stat
-rw-r--r-- 1 root root 2 Mar 10 06:08 tina
-rw-r--r-- 1 root root 444 Mar 22 2017 version-groups.conf
-rw-r--r-- 1 root root 2 Mar 10 06:03 ykyk
-rw-r--r-- 1 root root 2 Mar 10 06:11 ykyk11
CompletedProcess(args=['ls', '-l'], returncode=0)
>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0, stdout=b'crw-rw-rw- 1 root root 1, 3 Mar 10 00:52 /dev/null\n'
2.subprocess.call():执行指定的命令,返回命令执行状态,其功能类似于os.system(cmd)
>>> subprocess.call(['ls','-l'])
total 16632
-rw-r--r-- 1 root root 479 Mar 10 04:06 install.sh
-rw-r--r-- 1 root root 1169 Mar 10 09:11 my.cnf
drwxr-xr-x 16 501 501 4096 Mar 10 04:09 Python-3.6.4
-rw-r--r-- 1 root root 16992824 Dec 19 13:37 Python-3.6.4.tar.xz
-rw-r--r-- 1 root root 236 Mar 10 03:49 randomnum.py
-rwxr-x--- 1 root root 0 Mar 10 06:26 test_copy
-rwxr-x--- 1 root root 0 Mar 10 06:30 test_copy2
drwxr-xr-x. 79 root root 4096 Mar 10 06:16 test_copytree
-rwxr-x--- 1 ykyk ykyk 0 Mar 10 06:17 test_mode
-rwxr-x--- 1 root root 0 Mar 10 06:18 test_mode1
-rwxr-x--- 1 root root 0 Mar 10 06:17 test_stat
-rw-r--r-- 1 root root 2 Mar 10 06:08 tina
-rw-r--r-- 1 root root 444 Mar 22 2017 version-groups.conf
-rw-r--r-- 1 root root 2 Mar 10 06:03 ykyk
-rw-r--r-- 1 root root 2 Mar 10 06:11 ykyk11
0
>>> subprocess.call(['ls -l'],shell=True)
total 16632
-rw-r--r-- 1 root root 479 Mar 10 04:06 install.sh
-rw-r--r-- 1 root root 1169 Mar 10 09:11 my.cnf
drwxr-xr-x 16 501 501 4096 Mar 10 04:09 Python-3.6.4
-rw-r--r-- 1 root root 16992824 Dec 19 13:37 Python-3.6.4.tar.xz
-rw-r--r-- 1 root root 236 Mar 10 03:49 randomnum.py
-rwxr-x--- 1 root root 0 Mar 10 06:26 test_copy
-rwxr-x--- 1 root root 0 Mar 10 06:30 test_copy2
drwxr-xr-x. 79 root root 4096 Mar 10 06:16 test_copytree
-rwxr-x--- 1 ykyk ykyk 0 Mar 10 06:17 test_mode
-rwxr-x--- 1 root root 0 Mar 10 06:18 test_mode1
-rwxr-x--- 1 root root 0 Mar 10 06:17 test_stat
-rw-r--r-- 1 root root 2 Mar 10 06:08 tina
-rw-r--r-- 1 root root 444 Mar 22 2017 version-groups.conf
-rw-r--r-- 1 root root 2 Mar 10 06:03 ykyk
-rw-r--r-- 1 root root 2 Mar 10 06:11 ykyk11
0
注意上面两种方式的用法上的区别
>>> subprocess.call(['ls','-l'],stdout=subprocess.DEVNULL)
0
>>> subprocess.call(['ls','/ykyk'],stdout=subprocess.DEVNULL)
ls: cannot access /ykyk: No such file or directory
2
3.subprocess.check_call()
Python 2.5中新增的函数。 执行指定的命令,如果执行成功则返回状态码,否则抛出异常。其功能等价于subprocess.run(..., check=True)。
>>> subprocess.check_call(['ls','-l'])
total 16632
-rw-r--r-- 1 root root 479 Mar 10 04:06 install.sh
-rw-r--r-- 1 root root 1169 Mar 10 09:11 my.cnf
drwxr-xr-x 16 501 501 4096 Mar 10 04:09 Python-3.6.4
-rw-r--r-- 1 root root 16992824 Dec 19 13:37 Python-3.6.4.tar.xz
-rw-r--r-- 1 root root 236 Mar 10 03:49 randomnum.py
-rwxr-x--- 1 root root 0 Mar 10 06:26 test_copy
-rwxr-x--- 1 root root 0 Mar 10 06:30 test_copy2
drwxr-xr-x. 79 root root 4096 Mar 10 06:16 test_copytree
-rwxr-x--- 1 ykyk ykyk 0 Mar 10 06:17 test_mode
-rwxr-x--- 1 root root 0 Mar 10 06:18 test_mode1
-rwxr-x--- 1 root root 0 Mar 10 06:17 test_stat
-rw-r--r-- 1 root root 2 Mar 10 06:08 tina
-rw-r--r-- 1 root root 444 Mar 22 2017 version-groups.conf
-rw-r--r-- 1 root root 2 Mar 10 06:03 ykyk
-rw-r--r-- 1 root root 2 Mar 10 06:11 ykyk11
0
>>> subprocess.check_call(['ls -l'],shell=True)
total 16632
-rw-r--r-- 1 root root 479 Mar 10 04:06 install.sh
-rw-r--r-- 1 root root 1169 Mar 10 09:11 my.cnf
drwxr-xr-x 16 501 501 4096 Mar 10 04:09 Python-3.6.4
-rw-r--r-- 1 root root 16992824 Dec 19 13:37 Python-3.6.4.tar.xz
-rw-r--r-- 1 root root 236 Mar 10 03:49 randomnum.py
-rwxr-x--- 1 root root 0 Mar 10 06:26 test_copy
-rwxr-x--- 1 root root 0 Mar 10 06:30 test_copy2
drwxr-xr-x. 79 root root 4096 Mar 10 06:16 test_copytree
-rwxr-x--- 1 ykyk ykyk 0 Mar 10 06:17 test_mode
-rwxr-x--- 1 root root 0 Mar 10 06:18 test_mode1
-rwxr-x--- 1 root root 0 Mar 10 06:17 test_stat
-rw-r--r-- 1 root root 2 Mar 10 06:08 tina
-rw-r--r-- 1 root root 444 Mar 22 2017 version-groups.conf
-rw-r--r-- 1 root root 2 Mar 10 06:03 ykyk
-rw-r--r-- 1 root root 2 Mar 10 06:11 ykyk11
0
>>> subprocess.check_call('ls -l /ykyk',shell=True)
ls: cannot access /ykyk: No such file or directory
Traceback (most recent call last):
File "", line 1, in
File "/usr/local/python3.6.4/lib/python3.6/subprocess.py", line 291, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command 'ls -l /ykyk' returned non-zero exit status 2.
4.subprocess.check_output()
Python 2.7中新增的的函数。执行指定的命令,如果执行状态码为0则返回命令执行结果,否则抛出异常。
>>> print(si)
b'total 16632\n-rw-r--r-- 1 root root 479 Mar 10 04:06 install.sh\n-rw-r--r-- 1 root root 1169 Mar 10 09:11 my.cnf\ndrwxr-xr-x 16 501 501 4096 Mar 10 04:09 Python-3.6.4\n-rw-r--r-- 1 root root 16992824 Dec 19 13:37 Python-3.6.4.tar.xz\n-rw-r--r-- 1 root root 236 Mar 10 03:49 randomnum.py\n-rwxr-x--- 1 root root 0 Mar 10 06:26 test_copy\n-rwxr-x--- 1 root root 0 Mar 10 06:30 test_copy2\ndrwxr-xr-x. 79 root root 4096 Mar 10 06:16 test_copytree\n-rwxr-x--- 1 ykyk ykyk 0 Mar 10 06:17 test_mode\n-rwxr-x--- 1 root root 0 Mar 10 06:18 test_mode1\n-rwxr-x--- 1 root root 0 Mar 10 06:17 test_stat\n-rw-r--r-- 1 root root 2 Mar 10 06:08 tina\n-rw-r--r-- 1 root root 444 Mar 22 2017 version-groups.conf\n-rw-r--r-- 1 root root 2 Mar 10 06:03 ykyk\n-rw-r--r-- 1 root root 2 Mar 10 06:11 ykyk11\n'
>>> si = subprocess.check_output(['ls','-l'],universal_newlines=True)
>>> print(si)
total 16632
-rw-r--r-- 1 root root 479 Mar 10 04:06 install.sh
-rw-r--r-- 1 root root 1169 Mar 10 09:11 my.cnf
drwxr-xr-x 16 501 501 4096 Mar 10 04:09 Python-3.6.4
-rw-r--r-- 1 root root 16992824 Dec 19 13:37 Python-3.6.4.tar.xz
-rw-r--r-- 1 root root 236 Mar 10 03:49 randomnum.py
-rwxr-x--- 1 root root 0 Mar 10 06:26 test_copy
-rwxr-x--- 1 root root 0 Mar 10 06:30 test_copy2
drwxr-xr-x. 79 root root 4096 Mar 10 06:16 test_copytree
-rwxr-x--- 1 ykyk ykyk 0 Mar 10 06:17 test_mode
-rwxr-x--- 1 root root 0 Mar 10 06:18 test_mode1
-rwxr-x--- 1 root root 0 Mar 10 06:17 test_stat
-rw-r--r-- 1 root root 2 Mar 10 06:08 tina
-rw-r--r-- 1 root root 444 Mar 22 2017 version-groups.conf
-rw-r--r-- 1 root root 2 Mar 10 06:03 ykyk
-rw-r--r-- 1 root root 2 Mar 10 06:11 ykyk11没有返回码
5.subprocess.getoutput()与subprocess.getstatusoutput()
>>> s2code,output = subprocess.getstatusoutput('ls -l')
>>> print(s2code)
0>>> print(output)
total 16632
-rw-r--r-- 1 root root 479 Mar 10 04:06 install.sh
-rw-r--r-- 1 root root 1169 Mar 10 09:11 my.cnf
drwxr-xr-x 16 501 501 4096 Mar 10 04:09 Python-3.6.4
-rw-r--r-- 1 root root 16992824 Dec 19 13:37 Python-3.6.4.tar.xz
-rw-r--r-- 1 root root 236 Mar 10 03:49 randomnum.py
-rwxr-x--- 1 root root 0 Mar 10 06:26 test_copy
-rwxr-x--- 1 root root 0 Mar 10 06:30 test_copy2
drwxr-xr-x. 79 root root 4096 Mar 10 06:16 test_copytree
-rwxr-x--- 1 ykyk ykyk 0 Mar 10 06:17 test_mode
-rwxr-x--- 1 root root 0 Mar 10 06:18 test_mode1
-rwxr-x--- 1 root root 0 Mar 10 06:17 test_stat
-rw-r--r-- 1 root root 2 Mar 10 06:08 tina
-rw-r--r-- 1 root root 444 Mar 22 2017 version-groups.conf
-rw-r--r-- 1 root root 2 Mar 10 06:03 ykyk
-rw-r--r-- 1 root root 2 Mar 10 06:11 ykyk11
>>> s2code,output = subprocess.getstatusoutput('ls -l /ykyk')
>>> print(s2code)
2
>>> print(output)
ls: cannot access /ykyk: No such file or directory