Python运行命令支持实时输出,超时和终止

时间:2019-06-24 07:02:16

标签: python

想要Python函数可以运行shell命令,例如

echo 'Process started'; ping 127.0.0.1 -i 2 ; echo 'Process finished'

要求

  1. 它可以捕获实时输出,并且当命令完成时,它具有返回值。
  2. 它可以设置超时,并且在超时时,该命令应被终止。

有人可以帮我吗?

Subprocess.run看起来不起作用,导致命令没有被杀死,仍在运行,

subprocess.run(cmd, stderr=sys.stderr, stdout=sys.stdout, shell=True, timeout=timeout)

2 个答案:

答案 0 :(得分:1)

实际上,timeout中的subprocess.run选项应该杀死该命令。似乎this doesn't work when shell=True is also set.如果不需要高级Shell功能,则可以随时将命令分解为参数,然后执行以下操作:

subprocess.run(['ping', '127.0.0.1', '-i', '2'], timeout = 10)

这还有一个优点,那就是很容易在Python内更改参数而不会引起安全问题。

答案 1 :(得分:0)

我相信os.system()可以满足您的需求:-

  1. 它显示实时输出,就像您在 终端
  2. 成功执行命令后,返回一个 代码(如果命令成功,则返回0)
  3. 可以通过Control + C(键盘中断)将其中断。

您可以剥离给定的复合命令,以创建每个单独的命令,例如:-

echo 'Process started'; ping 127.0.0.1 -i 2 ; echo 'Process finished'

成为:-

echo 'Process started'
ping 127.0.0.1 -i 2
echo 'Process finished'

否,您不能将每个命令存储在单独的变量/列表中。然后将其传递给os.system()

示例:-

import os

os.system("echo 'Process started'")
os.system("ping 127.0.0.1 -i 2")
os.system("echo 'Process Finished'")

样品输出:-

'Process started'

Pinging 127.0.0.1 with 32 bytes of data:
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

Ping statistics for 127.0.0.1:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
'Process Finished'

P.S。:-:这只是os.system()的外行示例。您可以将其进一步扩展到其故障安全版本。