这是运行任意命令返回其stdout数据的Python代码,或者在非零退出代码上引发异常:
proc = subprocess.Popen(
cmd,
stderr=subprocess.STDOUT, # Merge stdout and stderr
stdout=subprocess.PIPE,
shell=True)
Run Code Online (Sandbox Code Playgroud)
communicate 用于等待进程退出:
stdoutdata, stderrdata = proc.communicate()
Run Code Online (Sandbox Code Playgroud)
该subprocess模块不支持超时 - 能够终止运行超过X秒的进程 - 因此,communicate可能需要永久运行.
在旨在在Windows和Linux上运行的Python程序中实现超时的最简单方法是什么?
此代码 ping 各种机器。您能否帮我更改此代码,以便如果 ping 进程挂起超过 7 秒,它会关闭并返回一些标志?
(我想从使用 WMI 的机器中提取各种数据。为此,我将 ping 功能更改为其他功能。问题是在某些机器上 WMI 已损坏并且提取数据的过程无限期挂起。需要超时。)
import multiprocessing.dummy
import subprocess
import numpy as np
import time
start_time = time.time()
def ping(ipadd):
try:
response = subprocess.check_output(['ping', ipadd])
return True
except subprocess.CalledProcessError as e:
return False
#print(ping('10.25.59.20'))
machine_names = \
'''
ya.ru
microsoft.com
www.google.com
www.amazon.com
www.nasa.com
'''.split()
np_machine_names = np.array(machine_names)
p = multiprocessing.dummy.Pool(7)
ping_status = p.map(ping, machine_names)
np_ping_status = np.fromiter(ping_status, dtype=bool)
print(*np_machine_names[np_ping_status], sep = '\n')
run_time = time.time() - start_time
print(f'Runtime: {run_time:.0f}')
Run Code Online (Sandbox Code Playgroud)
更新:虽然我很欣赏关于添加超时到子进程的提示,但问题仍然存在。如何关闭挂起的功能?假设我已将 …