https://www.cnblogs.com/pennyy/p/4248934.html

(1) os.system

仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息

代码如下:
system(command) -> exit_status
Execute the command (a string) in a subshell.

如果在命令行下执行,结果直接打印出来

代码如下:
>>>  os.system('ls')
04101419778.CHM   bash      document    media      py-django   video
11.wmv            books     downloads   Pictures  python
all-20061022      Desktop   Examples    project    tools

(2) os.popen

该方法不但执行命令还返回执行后的信息对象

代码如下:
 
popen(command [, mode='r' [, bufsize]]) -> pipe
Open a pipe to/from a command returning a file object.

例如:

代码如下:
>>> tmp = os.popen('ls *.py').readlines()
>>> tmp
Out[21]: ['dump_db_pickle.py ',
'dump_db_pickle_recs.py ',
'dump_db_shelve.py ',
'initdata.py ', '__init__.py ',
'make_db_pickle.py ',
'make_db_pickle_recs.py ',
'make_db_shelve.py ',
'peopleinteract_query.py ',
'reader.py ', 'testargv.py ',
'teststreams.py ',
'update_db_pickle.py ',
'writer.py ']

好处在于:将返回的结果赋于一变量,便于程序的处理。

(3)  使用模块 subprocess

代码如下:
>>>  import subprocess
>>> subprocess.call(["cmd", "arg1", "arg2"],shell=True)

获取返回和输出:

代码如下:
import subprocess
p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():    
print line,
retval = p.wait()

(4)  使用模块 commands

代码如下:
>>>  import commands
>>> dir(commands) ['__all__', '__builtins__', '__doc__', '__file__', '__name__', 'getoutput', 'getstatus','getstatusoutput', 'mk2arg', 'mkarg']
>>> commands.getoutput("date") 'Wed Jun 10 19:39:57 CST 2009'
>>>
>>> commands.getstatusoutput("date")
(0, 'Wed Jun 10 19:40:41 CST 2009')

注意: 当执行命令的参数或者返回中包含了中文文字,那么建议使用subprocess,如果使用os.popen则会出现下面的错误:

代码如下:
Traceback (most recent call last):  
File "./test1.py", line 56, inmain()  
File "./test1.py", line 45, in main   
  fax.sendFax()  
File "./mailfax/Fax.py", line 13, in sendFax    
os.popen(cmd)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 46-52: ordinal not inrange(128)
 
 
 
 
os.system(command)

这个函数可以调用 shell运行命令行command并且返回它的返回值。试一下在 python的解释器里输入os.system(”ls -l”),就可以看到”ls”列出了当前目录下的文件。可以说,通过这个函数,python就拥有了shell的所有能力。呵呵。。不过,通常这条命令不需要用到。因为shell常用的那些命令在python中通常有对应而且同样简洁的写法。

shell中最常用的是ls命令,python对应的写法是:os.listdir(dirname),这个函数返回字符串列表,里面是所有的文件名,不过不包含”.”和”..”。如果要遍历整个目录的话就会比较复杂一点。我们等下再说吧。先在解释器里试一下:

>>> os.listdir(”/”)

[’tmp’, ‘misc’, ‘opt’, ‘root’, ‘.autorelabel’, ’sbin’, ’srv’, ‘.autofsck’, ‘mnt’, ‘usr’, ‘var’, ‘etc’, ’selinux’, ‘lib’, ‘net’, ‘lost found’, ’sys’, ‘media’, ‘dev’, ‘proc’, ‘boot’, ‘home’, ‘bin’]

就像这样,接下去所有命令都可以在python的解释器里直接运行观看结果。

对应于cp命令的是:shutil.copy(src,dest),这个函数有两个参数,参数src是指源文件的名字,参数dest则是目标文件或者目标目录的名字。 如果dest是一个目录名,就会在那个目录下创建一个相同名字的文件。与shutil.copy函数相类似的是 shutil.copy2(src,dest),不过copy2还会复制最后存取时间和最后更新时间。

不过,shell的cp命令还可以复制目录,python的shutil.copy却不行,第一个参数只能是一个文件。这怎么办?其实,python还有个 shutil.copytree(src,dst[,symlinks]) 。参数多了一个symlinks,它是一个布尔值,如果是True的话就创建符号链接。

移动或者重命名文件和目录呢?估计被聪明的朋友猜到了,shutil.move(src,dst),呵呵。。与mv命令类似,如果src和dst在同一个文件系统上,shutil.move只是简单改一下名字,如果src和dst在不同的文件系统上,shutil.move会先把src复制到dst,然后删除src文件。看到现在,大多数朋友应该已经对 python的能力有点眉目了,接下来我就列个表,介绍一下其它的函数:

os.chdir(dirname)
把当前工作目录切换到dirname下

os.getcwd()
返回当前的工作目录路径

os.chroot(dirname)
把dirname作为进程的根目录。和*nix下的chroot命令类似

os.chmod(path,mode)
更改path的权限位。mode可以是以下值(使用or)的组合:

os.chown(path,uid,gid)
改变文件的属主。uid和gid为-1的时候不改变原来的属主。

os.link(src,dst)
创建硬连接

os.mkdir(path,[mode])
创建目录。mode的意义参见os.chmod(),默认是0777

os.makedirs(path,[mode])
和os.mkdir()类似,不过会先创建不存在的父目录。

os.readlink(path)
返回path这个符号链接所指向的路径

os.remove(path)
删除文件,不能用于删除目录

os.rmdir(path)
删除文件夹,不能用于删除文件

os.symlink(src,dst)
创建符号链接

shutil.rmtree(path[,ignore_errors[,onerror]])

删除文件夹
介绍了这么多,其实只要查一下os和shutil两个模块的文档就有了,呵呵。。真正编写 shell脚本的时候还需要注意:

1.环境变量。python的环境变量保存在os.environ这个字典里,可以用普通字典的方法修改它,使用system启动其它程序的时候会自动被继承。比如:

os.environ[”fish”]=”nothing”
不过也要注意,环境变量的值只能是字符串。和shell有些不同的是,python没有 export环境变量这个概念。为什么没有呢?因为python没有必要有:-)

2.os.path这个模块里包含了很多关于路径名处理的函数。在shell里路径名处理好像不是很重要,但是在python里经常需要用到。最常用的两个是分离和合并目录名和文件名:

os.path.split(path) -> (dirname,basename)
这个函数会把一个路径分离为两部分,比如:os.path.split(”/foo /bar.dat”)会返回(”/foo”,”bar.dat”)

os.path.join(dirname,basename)
这个函数会把目录名和文件名组合成一个完整的路径名,比如:os.path.join(”/foo”,”bar.dat”)会返回”/foo/bar.dat”。这个函数和os.path.split()刚好相反。

4. 应用python编写shell脚本经常要用到os,shutil,glob(正则表达式的文件名),tempfile(临时文件),pwd(操作 /etc/passwd文件),grp(操作/etc/group文件),commands(取得一个命令的输出)。前面两个已经基本上介绍完了,后面几个很简单,看一下文档就可以了。

5.sys.argv是一个列表,保存了python程序的命令行参数。其中 sys.argv[0]是程序本身的名字。
不能光说不练,接下来我们就编写一个用于复制文件的简单脚本。前两天叫我写脚本的同事有个几万个文件的目录,他想复制这些文件到其它的目录,又不能直接复制目录本身。他试了一下”cp src/* dest/”结果报了一个命令行太长的错误,让我帮他写一个脚本。操起python来:
import sys,os.path,shutil
for f in os.listdir(sys.argv[1]):
    shutil.copy(os.path.join(sys.argv[1],f),sys.argv[2])

[转帖]Python执行Linux系统命令的4种方法的更多相关文章

  1. Python执行Linux系统命令的4种方法

    http://www.jb51.net/article/56490.htm (1) os.system 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 复制代码代码如下: system( ...

  2. python执行linux命令的两种方法

    python执行linux命令有两种方法: 在此以Linux常用的ls命令为例: 方法一:使用os模块 1 2 3 shell# python >> import os >> ...

  3. Python执行Linux系统命令方法

    Python执行Linux系统命令的4种方法 (1) os.system 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 复制代码代码如下: system(command) -> ...

  4. 【erlang】执行linux命令的两种方法

    os.cmd(Cmd) os模块提供了cmd函数可以执行linux系统shell命令(也可以执行windows命令).返回一个Cmd命令的标准输出字符串结果.例如在linux系统中执行os:cmd(& ...

  5. PHP执行linux系统命令

    本文是第一篇,讲述如何在PHP中执行系统命令从而实现一些特殊的目的,比如监控服务器负载,重启MySQL.更新SVN.重启Apache等.第二篇<PHP监控linux服务器负载>:http: ...

  6. MySQL命令执行sql文件的两种方法

    MySQL命令执行sql文件的两种方法 摘要:和其他数据库一样,MySQL也提供了命令执行sql脚本文件,方便地进行数据库.表以及数据等各种操作.下面笔者讲解MySQL执行sql文件命令的两种方法,希 ...

  7. linux安装IPython四种方法

    IPython是Python的交互式Shell,提供了代码自动补完,自动缩进,高亮显示,执行Shell命令等非常有用的特性.特别是它的代码补完功能,例如:在输入zlib.之后按下Tab键,IPytho ...

  8. python 3.x 字典的11种方法

    python 3.x 字典的11种方法2017年11月25日 01:02:11 Milton-Long 阅读数:535 标签: python python字典方法 更多个人分类: python-学习之 ...

  9. python实现XML解析的三种方法

    python实现XML解析的三种方法 三种方法:一是xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合:二是xml.sax.*模块,它是SAX API的实 ...

  10. 执行shell脚本的几种方法及区别

    执行shell脚本的几种方法及区别 http://blog.csdn.net/lanxinju/article/details/6032368 (认真看) 注意:如果涉及到脚本之间的调用一定要用 . ...

随机推荐

  1. X410的白嫖方案

    微软商店下的x410要收费试用也就几天,记录白嫖方案.配置和使用跳转到上一篇文章:Windows下使用图形化的Havoc C2 编译运行 GitHub上start最多的是这个仓库,但是已经很久没有维护 ...

  2. 关于 x^n + 1 形式因式分解的讨论

    昨晚一个同学问我立方和分解,突发奇想想到了这个问题.看到网上关于这个问题的许多解答都不是很准确.在此修正一下. 引理一:立方和公式 对于形如 \(a^3 + b^3\) 的式子,有因式分解: \(a^ ...

  3. 5分钟搞定vue3函数式弹窗

    前言 最近接到一个需求,需要在一些敏感操作进行前要求输入账号和密码,然后将输入的账号和密码加到接口请求的header里面.如果每个页面都去手动导入弹窗组件,在点击按钮后弹出弹窗.再拿到弹窗返回的账号密 ...

  4. CodeForces 1009E Intercity Travelling 概率DP

    原题链接 题意 给我们一个长为n的序列,要求我们从头开始向右走n个节点,每个位置都有1 / 2的概率将我们传送回1号点之前,不过我们只需要完成走n步的任务就可以了.求我们走过的元素和 乘以 2的n - ...

  5. 第二部分_Shell脚本变量部分超详细解析

    Shell脚本变量部分超详细解析 变量的定义 [基本知识补充] 基本符号的意义: 脚本执行和调试方法: 1. 变量是什么? 一句话概括:变量是用来临时保存数据的,该数据是可以变化的数据. [注意] 单 ...

  6. 云图说丨初识华为云DDoS防护AAD——DDoS攻击防护平台

    DDoS攻击是指分布式拒绝服务,是一种网络攻击手法. 本文分享自华为云社区<[云图说]第297期 初识华为云DDoS防护AAD--DDoS攻击防护平台>,作者:阅识风云. DDoS攻击是指 ...

  7. 火山引擎数智平台VeDI荣获虎啸奖“年度最佳智能营销平台”奖项

    近日,由中国商务协会数字营销专业委员会指导的第十四届虎啸奖正式公布获奖名单,火山引擎数智平台VeDI荣获技术平台/产品类奖项.   作为国内品牌营销领域兼具权威性.前瞻性以及创新性的赛事活动,第十四届 ...

  8. 朋友们,就在今天,JDK 21,它终于带着重磅新特性正式发布了!

    你好呀,我是歪歪. 朋友们,好消息,好消息,重磅好消息. 从今年年初就一直在喊的具有革命性.未来性.开创新纪元的 JDK 21 按照官方的时间计划表,今天终于是要正式 GA 了: https://op ...

  9. Jenkins 多分支流水线(SVN)

    实际应用过程中,一般多分支流水线的方式用得比较多一些, master 对应 生成环境 develop 对应 测试环境, 将不同分支的代码构建到不同的环境中 添加 Jenkinsfile 文件 Jenk ...

  10. COOIS增强

    一.订单抬头增强 二.结构添加字段 添加ZGCWL字段 三.BADI增强 四.其他界面增强 不同的界面,选择不同的修改结构 抬头 ct_ioheader 组件 ct_ioopcomp 工序 ct_io ...