Python的调用程序

任务

  1. 调用系统命令ping 判断局域网内有哪些主机存活
  2. 假设你用c语言写了一个算法,需要对该算法进行测试。测试的数据集几百个。这时可以使用过GCC生成test.exe,再使用python批量调用该exe去测试数据集。 简而言之,就是python需要调用系统程序或者其他程序。

方法

  1. os.system
  2. os.popen
  3. subprocess

os.system

假设有一个test.exe,返回值为0或者1.调用后,在窗口会显示test.exe中printf的信息,并且返回值为0或者1.调用系统进程类似。这个方法的缺点很明显,返回值中没有包含想要的内容,比如下面的ping结果。

>>> os.system("ping 192.168.1.1")

正在 Ping 192.168.1.1 具有 32 字节的数据:
来自 192.168.1.1 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.1.1 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.1.1 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.1.1 的回复: 字节=32 时间<1ms TTL=64

192.168.1.1 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms
0

os.popen

这个方法可以返回filelike的结果,使用文件的读方法可以得到有效信息,但是没有程序的返回值。

>>> s = os.popen("ping 192.168.1.1")
>>> s.read()
'
正在 Ping 192.168.1.1 具有 32 字节的数据:
来自 192.168.1.1 的回复: 字节=32
时间<1ms TTL=64
来自 192.168.1.1 的回复: 字节=32 时间=4ms TTL=64
来自 192.168.
1.1 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.1.1 的回复: 字节=32 时间<1ms T
TL=64

192.168.1.1 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失
 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 4ms
,平均 = 1ms
'
>>>

subprocess

这个模块的功能比较强大,同时使用起来也比较复杂。官方说法是用来替代os.system的。在The Python Standard Library17.5章节。 基本上包含了上面两个方法的功能。

import subprocess
a = subprocess.run("ping 192.168.1.1",stdout=subprocess.PIPE)
a.stdout.decode("gb2312")
a.returncode

上面的模块既可以返回程序(进程)的返回结果,又可以返回标准打印信息。

>>> a.stdout.decode("gb2312")
'
正在 Ping 192.168.1.1 具有 32 字节的数据:
来自 192.168.1.1 的回复: 字节=
32 时间<1ms TTL=64
来自 192.168.1.1 的回复: 字节=32 时间<1ms TTL=64
来自 1
92.168.1.1 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.1.1 的回复: 字节=32
时间<1ms TTL=64

192.168.1.1 的 Ping 统计信息:
    数据包: 已发送 = 4,
已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最
短 = 0ms,最长 = 0ms,平均 = 0ms
'
>>> a.returncode
0
>>>
原文地址:https://www.cnblogs.com/WeyneChen/p/6670635.html