使用psutil
我得到一个进程列表;我想过滤掉那些有特定名字的人。
filter(lambda p: p.name()=="x", psutil.process_iter())
但是,psutil.Process.name()
函数可能会抛出......在这种情况下filter
会受到打击,并向我重新引发异常。
是否有filter_noexception
种函数/习语,或者我是否需要自己将p.name()
包装到异常吞咽函数中?
答案 0 :(得分:2)
你可以这样做:
def try_get_name(process_instance):
try:
return process_instance.name()
except:
return ""
filter(lambda p: try_get_name(p)=="x", psutil.process_iter())
答案 1 :(得分:1)
我添加了一个replace_exception
函数装饰器:
def replace_exception(original, default=None):
def safe(*args, **kwargs):
try:
return original(*args, **kwargs)
except:
return default
return safe
现在我可以'保护'我的功能:
filter(replace_exception(lambda p: p.name()=="x"), psutil.process_iter())
答案 2 :(得分:0)
filter
中没有此类处理,但documentation表示:
请注意,filter(function,iterable)等同于[item for item in iterable if function(item)] if function is not None
考虑到这一点,我会自己处理流程:
def filter_noexception(func, iter):
result = []
for i in iter:
try:
if func():
result.append(i)
except:
pass
return result
filtered_processes = filter_noexception(lambda p: p.name() == "x", psutil.process_iter())