Это решение убивает дерево процессов в случае оболочки = True, передает параметры процессу (или нет), имеет тайм-аут и получает вывод stdout, stderr и процесс обратного вызова (он использует psutil для kill_proc_tree) , Это было основано на нескольких решениях, размещенных в SO, включая jcollado's. Проводка в ответ на комментарии Ансона и юрида в ответ jcollado. Протестировано в Windows Srvr 2012 и Ubuntu 14.04. Обратите внимание, что для Ubuntu вам необходимо изменить вызов parent.children (...) parent.get_children (...).
def kill_proc_tree(pid, including_parent=True):
parent = psutil.Process(pid)
children = parent.children(recursive=True)
for child in children:
child.kill()
psutil.wait_procs(children, timeout=5)
if including_parent:
parent.kill()
parent.wait(5)
def run_with_timeout(cmd, current_dir, cmd_parms, timeout):
def target():
process = subprocess.Popen(cmd, cwd=current_dir, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
# wait for the process to terminate
if (cmd_parms == ""):
out, err = process.communicate()
else:
out, err = process.communicate(cmd_parms)
errcode = process.returncode
thread = Thread(target=target)
thread.start()
thread.join(timeout)
if thread.is_alive():
me = os.getpid()
kill_proc_tree(me, including_parent=False)
thread.join()
Вот пример каждого:
from inspect import stack
class Foo:
def __init__(self):
print __file__
print self.__class__.__name__
print stack()[0][3]
f = Foo()
import sys
class A:
def __init__(self):
print __file__
print self.__class__.__name__
print sys._getframe().f_code.co_name
a = A()
self.__class__.__name__ # name of class i'm in
для остальных модулей sys и trace
http://docs.python.org/library/sys.html http://docs.python.org/library /trace.html
Дополнительная информация: https://mail.python.org/pipermail/python-list/2001-August/096499.html и http://www.dalkescientific.com/writings/diary/archive/2005/04/20/tracing_python_code.html
вы хотели, чтобы он использовался для сообщения об ошибках, потому что модуль трассировки может это обработать:
Будьте очень осторожны. Подумайте:
class A:
pass
B = A
b = B()
Какое здесь «имя класса» b
? Это А или Б? Почему?
Дело в том, что тебе не нужно знать или заботиться. Объект есть то, что он есть: его имя очень редко бывает полезным.