Python 3(11)调用系统命令行

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




  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值