Python中执行系统命令常见的几种方法

Python010

Python中执行系统命令常见的几种方法,第1张

作为胶水语言,Python可以很方便地执行系统命令,从而帮助我们快速的完成任务而且Python执行系统命令可采用的方法有很多,本文重点介绍一下:os.system()、os.popen()和subprocess模块。

1. os.system()

这个方法直接调用标准C的system()函数,仅仅在一个子终端运行系统命令,而不能获取执行返回的信息。

>>>import os

>>>output = os.system('cat /proc/cpuinfo')

processor : 0

vendor_id : AuthenticAMD

cpu family : 21

... ...

>>>output # doesn't capture output

0

2. os.popen()

这个方法执行命令并返回执行后的信息对象,是通过一个管道文件将结果返回。

>>>output = os.popen('cat /proc/cpuinfo')

>>>output

>>>print output.read()

processor : 0

vendor_id : AuthenticAMD

cpu family : 21

... ...

>>>

3. subprocess模块

该模块是一个功能强大的子进程管理模块,是替换os.system, os.spawn*等方法的一个模块。

>>>import subprocess

>>>subprocess.Popen(["ls", "-l"]) # python2.x doesn't capture

output

>>>subprocess.run(["ls", "-l"]) # python3.x doesn't capture

output

>>>total 68

drwxrwxr-x 3 xl xl 4096 Feb 8 05:00 com

drwxr-xr-x 2 xl xl 4096 Jan 21 02:58 Desktop

drwxr-xr-x 2 xl xl 4096 Jan 21 02:58 Documents

drwxr-xr-x 2 xl xl 4096 Jan 21 07:44 Downloads

... ...

>>>

魔法方法 (Magic Methods) 是Python中的内置函数,一般以双下划线开头和结尾,例如__ init__ __del__ 等。之所以称之为魔法方法,是因为这些方法会在进行特定的操作时会自动被调用。

在Python中,可以通过dir()方法来查看某个对象的所有方法和属性,其中双下划线开头和结尾的就是该对象的魔法方法。以字符串对象为例:

可以看到字符串对象有 __add__ 方法,所以在Python中可以直接对字符串对象使用"+"操作,当Python识别到"+"操作时,就会调用该对象的 __add__ 方法。有需要时我们可以在自己的类中重写 __add__ 方法来完成自己想要的效果。

我们重写了 __add__ 方法,当Python识别"+"操作时,会自动调用重写后的 __add__ 方法。可以看到,魔法方法在类或对象的某些事件出发后会自动执行,如果希望根据自己的程序定制特殊功能的类,那么就需要对这些方法进行重写。使用魔法方法,我们可以非常方便地给类添加特殊的功能。

1、构造与初始化

__ new __ __ init __ 这两个魔法方法常用于对类的初始化操作。上面我们创建a1 = A("hello")时,但首先调用的是 __ new __ 初始化一个类分为两步:

a.调用该类的new方法,返回该类的实例对象

b.调用该类的init方法,对实例对象进行初始化。

__new__ (cls, *args, **kwargs)至少需要一个cls参数,代表传入的类。后面两个参数传递给 __ init __ 。在 __ new __ 可以决定是否继续调用 __ init __ 方法,只有当 __ new __ 返回了当前类cls的实例,才会接着调用 __ init __ 。结合 __ new __ 方法的特性,我们可以通过重写 __ new __ 方法实现Python的单例模式:

可以看到虽然创建了两个对象,但两个对象的地址相同。

2、控制属性访问这类魔法

方法主要对对象的属性进行访问、定义、修改时起作用。主要有:

__getattr__(self, name): 定义当用户试图获取一个属性时的行为。

__getattribute__(self, name):定义当该类的属性被访问时的行为(先调用该方法,查看是否存在该属性,若不存在,接着去调用getattr)。

__setattr__(self, name, value):定义当一个属性被设置时的行为。

当初始化属性时如self.a=a时或修改实例属性如ins.a=1时本质时调用魔法方法self. __ setattr __ (name,values);当实例访问某个属性如ins.a本质是调用魔法方法a. __ getattr __ (name)

3、容器类操作

有一些方法可以让我们自己定义自己的容器,就像Python内置的List,Tuple,Dict等等;容器分为可变容器和不可变容器。

如果自定义一个不可变容器的话,只能定义__ len__ 和__ getitem__ ;定义一个可变容器除了不可变容器的所有魔法方法,还需要定义__ setitem__ 和__ delitem__ ;如果容器可迭代。还需要定义__ iter __。

__len__(self):返回容器的长度

__getitem__(self,key):当需要执行self[key]的方式去调用容器中的对象,调用的是该方法

__setitem__(self,key,value):当需要执行self[key] = value时,调用的是该方法

__iter__(self):当容器可以执行 for x in container:,或者使用iter(container)时,需要定义该方法

下面举一个例子,实现一个容器,该容器有List的一般功能,同时增加一些其它功能如访问第一个元素,最后一个元素,记录每个元素被访问的次数等。

这类方法的使用场景主要在你需要定义一个满足需求的容器类数据结构时会用到,比如可以尝试自定义实现树结构、链表等数据结构(在collections中均已有),或者项目中需要定制的一些容器类型。

魔法方法在Python代码中能够简化代码,提高代码可读性,在常见的Python第三方库中可以看到很多对于魔法方法的运用。

因此当前这篇文章仅是抛砖引玉,真正的使用需要在开源的优秀源码中以及自身的工程实践中不断加深理解并合适应用。