Python学习笔记----基础篇10----模块1

一、模块的定义:

本质就是一个.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_hello
from 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 2018


import 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_mode

su  -  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 "<stdin>", line 1, in <module>
   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

posted on 2018-03-10 16:47  ykyk_dba  阅读(206)  评论(0编辑  收藏  举报

导航