Python3 入门专栏
http://blog.csdn.net/column/details/19679.html
调用 OS 命令行
python 中调用 os 的命令行,有以下几方法:
os.system(command)
类似 C 中的 system() 函数,command 为os命令;
返回值在不同os上不同,Linux 返回值是执行命令的 exit 值,Window 返回值为执行命令后 shell 的返回值;
该方法无法获取到运行命令的输出;
import os
os.system("mv ./test ./rename_test")
os.popen()
该方法通过调用管道的方式来实现的,在调用结束后,会返回一个记录调用输出结果的 file 对象,该方法原型如下:
os.popen(command [, mode, buffering])
command:调用命令mode:返回 file 对象的模式,默认为 “r” 只读模式buffering:缓冲区大小,默认 -1 为无限制
该方法调用后会导致当前线程阻塞,直到调用的执行指令执行完毕;
import os
pipeline = os.popen("ls")
print(pipeline.read())
使用 subprocess.Popen
subprocess 模块是从 python 2.4 开始内置的,用于产生子进程,并连接子进程的标准输入输出,功能十分强大,主要用于替代其他几个老的模块和函数,如: os.system() ,os.spawn,os.popen,commands 等;
Popen 构建方法
其中主要使用 subprocess.Popen 类来创建、管理子进程,
该类构建方法常用的入参如下:
subprocess.Popen(commands,
bufsize=0,
stdin=None, stdout=None,stderr=None,
shell=False,
cwd=None, env=None
universal_newlines=False)
commands | 命令字符串或字符串列表 |
bufsize | 缓存区大小,默认 0 即无缓冲; 负值表示默认系统缓冲(一般是全缓冲); |
stdin stdout stderr | 子进程标准输入、标准输出、标准错误输出;默认 None 即继承父进程; 可选值包括:subprocess.PIPE(使用新管道),文件对象; stderr 还有 subprocess.STDOUT(标准错误流输出到标准输出中) |
shell | 指定 commonds 是否在 shell 解释,默认False,但设置为 True 时, unix 下相当于 commonds 前面添加了 "/bin/sh" "-c" window 下相当于 commands 前添加了 “cmd.exe /c” |
cwd | 设置工作目录 |
env | 设置环境变量 |
universal_newlines | 当设置为 True 时,各种换行符都统一处理成 "\n" |
Popen 使用示例
import subprocess
# 子进程的标准输出默认为当前控制台
p = subprocess.Popen("ls", shell=True)
p.wait() # 阻塞当前线程直到子进程 p 执行结束
# 子进程的标准输出设置为管道对象
p = subprocess.Popen("ls", shell=True, stdout=subprocess.PIPE, universal_newlines=True)
p.wait()
result_lines = p.stdout.readlines() # 从子进程 p 的标准输出中读取所有行,并储存在一个list对象中
for line in result_lines:
print(line.strip())
执行的输出结果如下图:
Popen 内置方法
popen.poll() | 检查子进程是否已经结束,返回 returncode 属性; |
popen.wait() | 阻塞当前线程直到子进程执行结束,返回 returncode 属性; |
popen.send_signal(signal) | 向子进程发送 signal 信号; |
popen.terminate() | 停止子线程; POSIX下发送 SIGTERM 信号,window 下调用 TerminateProcess() API |
popen.kill() | 杀死子线程; POSIX下发送 SIGKILL 信号,window 下调用 TerminateProcess() API |
popen.stdin | 如果stdin 参数是PIPE,此属性就是一个文件对象,否则为None ; |
popen.stdout | 如果stdout参数是PIPE,此属性就是一个文件对象,否则为None ; |
popen.stderr | 如果stderr 参数是PIPE,此属性就是一个文件对象,否则为None ; |
popen.pid | 子进程的进程号; 如果shell 参数为True,这属性指的是子shell的进程号。 |
popen.returncode | 子程序的返回值 |
获取命令行参数
可以通过 sys.argv 变量来获取脚本启动参数,
sys.argv
为一个 list 对象,第1个元素为脚本名称,之后的元素为启动参数,如下示例:
test.py
import sys
print("脚本名:", sys.argv[0])
for i in range(1,len(sys.argv)):
print("参数", i, ":", sys.argv[i])
测试结果如下:
yulin@DESKTOP-assad /user/temp $ py test.py a b c d e
脚本名: test.py
参数 1 : a
参数 2 : b
参数 3 : c
参数 4 : d
参数 5 : e