2015-07-20 4 views
1

Я бег кодаРучки/уловы RuntimeWarnings в связи с igraph питоном

testgraph = igraph.Graph.Degree_Sequence(degseq,method = "vl") 

иногда бросает предупреждение

RuntimeWarning: Cannot shuffle graph, maybe there is only a single one? at gengraph_graph_molloy_hash.cpp:332 

Я хотел бы, чтобы поймать это предупреждение, так что я могу перестать работать с которые имеют только один граф.

Я попытался

degseq = [1,2,2,3] 
try: 
    testgraph = igraph.Graph.Degree_Sequence(degseq,method = "vl") 
except RuntimeWarning: 
    print degseq 
else: 
    print "go on" 

который возвращает предупреждение, а затем "идти".

Я попытался модернизировать предупреждение исключения с

warnings.simplefilter('error', 'Cannot shuffle graph') 
degseq = [1,2,2,3] 
try: 
    testgraph = igraph.Graph.Degree_Sequence(degseq,method = "vl") 
except RuntimeWarning: 
    print degseq 
else: 
    print "go on" 

среди других, а теперь что-то странное происходит! Он возвращает

testgraph = igraph.Graph.Degree_Sequence(degseq,method = "vl") 
MemoryError: Error at src/attributes.c:284: not enough memory to allocate attribute hashes, Out of memory 

Как заставить python уловить RuntimeWarning? И почему возникает новое исключение, когда я обновляю предупреждение до исключения?

ответ

0

Вы можете попробовать это, чтобы поймать все предупреждения во время разговора igraph:

from warnings import catch_warnings 
with catch_warnings(record=True) as caught_warnings: 
    testgraph = igraph.Graph.Degree_Sequence(degseq, method="vl") 
    if caught_warnings: 
     # caught_warnings is a list of warnings; do something with them here 

Что касается MemoryError, что вы видите: это на самом деле ошибка в интерфейсе питон igraph. Внутренне ядро ​​C библиотеки igraph (которое ничего не знает о языке хоста, в которое он встроен) вызывает предупреждение для вашей последовательности степеней. Затем он превращается в предупреждение Python, которое затем превращается в исключение с помощью вашего обработчика предупреждений. Тем не менее, ядро ​​C библиотеки igraph не ожидает, что предупреждения ядра играфа иногда превращаются в исключения, поэтому он с радостью продолжает выполнение кода для Graph.Degree_Sequence, замечает предупреждение, которое было превращено в исключение a несколько внутренних вызовов позже, и ошибочно приписывает его отказу какого-либо другого распределения памяти (что не имеет ничего общего с вашим первоначальным предупреждением).

+0

Я добавил сообщение об ошибке в журнал ошибок 'python-igraph' относительно' MemoryError': https://github.com/igraph/python-igraph/issues/38 –

Смежные вопросы