《Python编程》第二、三章:系统工具、脚本运行上下文

一、《Python编程》第二、三章概述

1.概括性介绍与系统编程相关的主要模块,这章介绍最为常用的系统工具,如:os,sys,os.path等

2.os.getcwd、sys.argv、os.environ、sys.stdin、stdout、stderr

二、系统编程概述

1.了解python系统模块

sys、os、os.path是python核心的系统模块;大多数系统级接口都集中在os和sys模块,os.path是python解释器真正的搜索路径;其他的标准模块也属于系统级模块,包括:

# glob:用于文件名扩展
# socket:用于网络连接和进程间通信(IPC)
# threading, _thread,queue:用于运行和同步化并发线程
# time, timeit:用于获取系统时间及相关细节
# subprocess, multiprocessing:用于启动和控制并行进程
# signal, select, shutil, tempfile :用于多种 系统相关任务
# 等
# 另外,一些内建函数实际上也是系统接口,例如open函数,就是文件系统的接口,大体而言,sys和os模块一起组成了python
# 内置系统工具的核心部分;

2.字符串方法基础知识

#字符串方法基础知识
#find()#返回首个匹配位置的偏移,匹配失败返回:-1
mystr = 'yyyyASDjjjjjj'
n=mystr.find('ASD')#返回首个匹配位置的偏移,匹配失败返回:-1
print(n)

#replace():全局替换
mystr0 = 'aassddffss'
mystr0=mystr0.replace('ss','AA')
print(mystr0)
#字符串搜索:存在返回True;不存在,返回False;类似于find
mystr1 = 'AAAAQWE'
print('AA' in mystr1)#True
print('d' in mystr1)#False
#strip():去除空白分隔符,rstrip()效果类似,只不过只是右边
mystr2 = '\tasdfg\n'
mystr2 = mystr2.strip()
print(mystr2)
mystr2 = '\tasdfg\n'
mystr2 = mystr2.rstrip()
print(mystr2)
#lower()大小写转换器
mystr3 = 'AAABBQWE'
mystr3 = mystr3.lower()
print(mystr3)
# isalpha: isalpha() 方法检测字符串是否只由字母组成
# isdigit: isdigit() 方法检测字符串是否只由数字组成
mystr4="123456"
print(mystr4.isalpha())#False
print(mystr4.isdigit())#True

# string:
import string
s = string.ascii_lowercase
print(s)#abcdefghijklmnopqrstuvwxyz
s = string.ascii_uppercase
print(s)#ABCDEFGHIJKLMNOPQRSTUVWXYZ
s = string.whitespace
print(s.encode("utf-8"))#b' \t\n\r\x0b\x0c'

#split():分隔为子字符串组成的列表
mystr5 = "aaa,bbb,ccc"
mystr5 = mystr5.split(',')
print(mystr5)#['aaa', 'bbb', 'ccc']
mystr5 = 'a b\nc\nd'
mystr5 = mystr5.split()
print(mystr5)#['a', 'b', 'c', 'd']

#连接子字符串列表
delim = 'NI'
st=delim.join(['aaa','bbb','ccc'])
print(st)#aaaNIbbbNIccc
#在列表元素间添加空格符,输入字符串
mystr6 = ' '.join(['aaa','bbb','ccc'])
print(mystr6)#aaa bbb ccc

#转换为字符组成的列表
chars = list('Lorrtt')
print(chars)#['L', 'o', 'r', 'r', 't', 't']

#生成分隔符:分隔符为空
chars.append("!")#列表追加
ch="".join(chars)
print(ch)#Lorrtt!

#字符串转换为整型:两种方式都是
print(int("42"),eval("42"))

#整型转换为字符串:两种方式都是
print(type(str(42)),type(repr(42)))

#分别借助格式化表达式和方法
print(type("%d" %42),'{:d}'.format(42))

3.os.system、os.popen、subprocess

os.system()只是简单的执行一条shell命令行,
# 但os.popen()还会连接到命令的标准输入/输出流;
listing = os.popen('dir /B').readlines()
print(listing)

#替代方案:subprocess模块,可以实现os.system;os.popen()相同的效果;一般
# 来说要求更多代码,但对流的连接和使用提供更完善的控制
import subprocess
#模拟os.system()
subprocess.call('python data_004.py') #类似os.system()
subprocess.call('cmd /C "type data_004.py"')#内建shell命令
subprocess.call('type data_004.py',shell=True)#相当于内建函数
#shell命令的局限
#1.shell命令移植性虽好,但却取决于所运行的命令;例:dir\type在windows可以,在Linux需要改为ls\cat
#2.将python文件作为程序运行与导入程序文件再调用其中的函数是截然不同的方式,前者要比后者慢得多(前者通常是在新进程里执行命令);
#os.startfile
# os.startfile("test.html")#在浏览器中打开文件
# os.startfile("技术部-岗位说明书.xlsx")#在microsoft excel中打开
# os.startfile("data_004.py")#python运行文件
# exec(open("data_004.py",encoding='utf-8').read())#python运行文件
#os模块其他函数:
# os.pipe():负责程序间通信
# os.execlp():启动新程序
# os.mkdir:创建新目录
# os.mkfifo:创建新的命名管道
# os.remove():根据路径名删除文件
# os.stat():获取文件底层信息
# os.open:打开基于底层描述符的文件

三、脚本运行上下文

# python程序可能有各种特定de环境,即程序启动时,操作系统会自动传给程序的信息(如:脚本可以获取下面几类系统级的输入和接口:)
# 当前工作路径(CWD):
# os.getcwd可以获取脚本启动目录,许多文件工具隐式地使用该变量;
# 命令行参数
# sys.argv可以获取在命令行键入的启动参数,将其作为脚本的输入;
# 标准流
# sys.stdin、stdout、stderr是三个核心的命令行shell工具;可以被print、os.popen、subprocess模块,io.StringIO类等调用;

1.getcwd

# 1.当前工作路径(CWD):除非指定绝对路径,否则当脚本处理文件时,将始终默认它们存在于CWD。
# 脚本可以使用os.getcwd获取明确的CWD路径,使用os.chdir改变它的CWD
# 脚本总是启动于CWD,而不是它所在的目录;反之,import永远首先搜索文件所在目录,而非CWD(除非二者是同一目录);
import os , sys
print('my os.getcwd =>',os.getcwd())
print('my sys.path =>',sys.path)

# 2.CWD,文件和import路径
# 无论你在哪个目录运行py文件,即:不管CWD是什么,python都会把你运行的py文件所在目录添加到sys.path(模块搜索路径)的最前面;
# 因此,你可以随意调用py文件所在目录的其他py文件中的脚步;

2.argv

# 4.命令行参数
# python可以通过sys模块获取脚步启动时命令行输入的信息,称为命令行参数,以内置字符串列表的形式存于sys.argv中;
# 命令行参数通过位置或使用‘-name value’词语组来传递;
print(sys.argv)

2.1 解析命令行参数

def getopts(argv):
    opts = {}
    while argv:
        # 判断argv列表的索引为0的元素是否是命令行参数的参数名;
        # 若参数字符串的索引0位置为“-”,则该参数是键;索引为1的argv的元素则为值
        if argv[0][0] == '-':
            opts[argv[0]] =argv[1]
            # 去掉已经赋值到字典中的索引为0,1的元素,形成新的列表,再次循环,直到[]循环停止;
            # 注意:列表索引不可超过列表长度;但是切片可以超过列表长度;超过则是空列表
            argv = argv[2:]
        else:
            argv =argv[1:]#若argv列表中的索引0号元素不是命令行参数,则从下一个元素开始再次循环;
    return opts
if __name__ == '__main__':
     from sys import argv
     print(argv)
     myargs = getopts(argv)
     if "-i" in myargs:
         print(myargs['-i'])
     print(myargs)
#在命令行运行该文件,入命令行参数 -i data.txt -o result.txt

3. shell变量

# shell环境变量
# shell变量有时称之为环境变量,python可以通过类似python字典的对象os.environ来访问;
# os.environ对象里每项对应一个shell的变量设置;
# shell变量通常在系统启动、startup文件、控制面板中设置;它能为系统提供系统级的配置

# 1.获取shell变量---》
# import os,pprint
# # print(os.environ.keys())#类似python字典的对象
# # pprint.pprint(list(os.environ.keys()))#只有字典key组成的列表
# # pprint.pprint(list(os.environ.values()))#只有字典Value组成的列表
# # print(os.environ['TMP'])#取字典中的某一个关键字的值
#
# # pprint.pprint(os.environ['PYTHONPATH'])
#
# for r in os.environ['PYTHONPATH'].split(os.pathsep):
#     print(r)
#     print(os.pathsep)#os.path的分隔符,自动识别目标平台(DOS/Windows为逗号;Linux/Unix为冒号)
# 2.修改shell变量
import os,subprocess
import pprint
print('setenv……', end="")
pprint.pprint(list(os.environ))
print(os.environ['USERNAME'])
os.environ['USERNAME'] = 'ithing'
print(os.environ['USERNAME'])
# 注意:一个子程序始终从它的父进程那里继承环境设置;
# 在Unix下,os.spawnx、os.fork/exec;或者所有平台下的os.popen、os.system、subprocess在启动时都会获得父进程的环境变量
# pprint.pprint(list(os.environ))
# 3.shell变量要点:父进程、putenv、getenv
# 你的程序中对shell所做的设置只对程序本身及其衍生的子程序有效,程序关闭后;失效;

4.标准流、重定向

# 标准流
# import sys
#
# for f in (sys.stdin,sys.stdout,sys.stderr):print(f)
# # 标准流:sys.stdin、sys.stdout、sys.stderr;它们是又一通用的通信方式。
# # 标准流是预先打开的python文件对象;它们在python启动时自动连接到你的程序上;
# # 默认在python启动时被绑定到控制台窗口。
# # 内部的print和input函数实际上只是标准输出/输入流的接口;因此他们的使用类似;
# print('hello stdout world')
# sys.stdout.write('hello stdout world')
#
# input('hello stdout world')
# print('hello stdout world')
# sys.stdin.readline()[:]

# 重定向
# 重定向标准输入流到不同文件,可以将一个测试脚本应用于任意的输入
# 重定向标准输出流使得我们能够保存及后续分析一个程序的输出
def interact():
    '''
    这是一个根据输入数字,运算出平方,然后输出结果的函数;
    :return:
    '''
    print('start……')
    while True:
        try:
            reply = input('Enter a number:')
        except EOFError:
            break
        else:
            num = int(reply)
            print("%d squared is %d" %(num,num**2))
    print("bye")

if __name__ == '__main__':
    interact()

# input.txt文件中,已预备了数字,作为输入内容
# output.txt文件作为接受结果的文件
# < filename:把标准输入流重定向到文件输入
# > filename:把标准输出流重定向到文件中;
# 在命令提示符中,python 4.py < input > output

5、用管道符(pipe)链接程序

知识点总结不管有几个程序通过管道符链接,上游程序的输出都会通过shell管道成为下游程序的输入;

预置条件:1、2;结果:3

1.在writer.py文件中:

2.在reader.py文件中:

3.命令行执行:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷凝娇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值