Python执行Unix/Linux命令示例

时间:2020-01-09 10:43:06  来源:igfitidea点击:

如何使用Python执行标准的Unix或者Linux Shell命令?
是否有使用Python程序调用Unix命令的命令?

您可以使用os.system()在子shell中执行命令。
这将调用标准C函数system()。
该函数将返回进程或者命令的退出状态。
该方法被认为是旧方法,不建议使用,但此处仅出于历史原因在此介绍。
建议使用子流程模块,它提供了更强大的功能来运行命令并检索其结果。

os.system示例(不建议使用)

语法为:

import os
os.system("command")

在此示例中,执行date命令:

import os
os.system("date")

输出示例:

Sat Nov 10 00:49:23 IST 2012
0

在此示例中,使用os.popen()执行date命令并将其输出存储到现在称为的变量中:

import os
f = os.popen('date')
now = f.read()
print "Today is ", now

输出示例:

Today is  Sat Nov 10 00:49:23 IST 2012

subprocess

os.system有很多问题,子进程是执行unix命令的更好方法。
语法为:

import subprocess
subprocess.call("command1")
subprocess.call(["command1", "arg1", "arg2"])

在此示例中,执行date命令:

import subprocess
subprocess.call("date")

输出示例:

Sat Nov 10 00:59:42 IST 2012
0

您可以使用以下语法来传递参数,即运行ls -l/etc/resolv.conf命令:

import subprocess
subprocess.call(["ls", "-l", "/etc/resolv.conf"])

输出示例:


要将输出存储到输出变量,请运行:

import subprocess
p = subprocess.Popen("date", stdout=subprocess.PIPE, shell=True)
(output, err) = p.communicate()
print "Today is", output

输出示例:

Today is Sat Nov 10 01:27:52 IST 2012

另一个示例(传递命令行参数):

import subprocess
p = subprocess.Popen(["ls", "-l", "/etc/resolv.conf"], stdout=subprocess.PIPE)
output, err = p.communicate()
print "*** Running ls -l command ***\n", output

输出示例:

*** Running ls -l command ***
-rw-r--r-- 1 root root 157 Nov  7 15:06 /etc/resolv.conf

在此示例中,运行ping命令并显示其输出:

import subprocess
p = subprocess.Popen(["ping", "-c", "10", "www.theitroad.local"], stdout=subprocess.PIPE)
output, err = p.communicate()
print  output

上面代码的唯一问题是output,err = p.communicate()将阻塞下一条语句,直到ping操作完成,即您将无法从ping命令获得实时输出。
因此,您可以使用以下代码来获取实时输出:

import subprocess
cmdping = "ping -c4 www.theitroad.local"
p = subprocess.Popen(cmdping, shell=True, stderr=subprocess.PIPE)
while True:
    out = p.stderr.read(1)
    if out == '' and p.poll() != None:
        break
    if out != '':
        sys.stdout.write(out)
        sys.stdout.flush()

输出示例:

PING www.theitroad.local (75.126.153.206) 56(84) bytes of data.
64 bytes from www.theitroad.local (75.126.153.206): icmp_req=1 ttl=55 time=307 ms
64 bytes from www.theitroad.local (75.126.153.206): icmp_req=2 ttl=55 time=307 ms
64 bytes from www.theitroad.local (75.126.153.206): icmp_req=3 ttl=55 time=308 ms
64 bytes from www.theitroad.local (75.126.153.206): icmp_req=4 ttl=55 time=307 ms
 
--- www.theitroad.local ping statistics --
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 307.280/307.613/308.264/0.783 ms