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