2017-05-30 4 views
0

Pour une raison quelconque, lorsque j'essaie d'implémenter cette fonction dans mon graphe créé dynamiquement, j'obtiens cette erreur bizarre. Je peux exécuter les exemples de fonctions donnés en ligne mais il échoue quand je l'exécute.graphviz_layout: AttributeError: l'objet 'NoneType' n'a pas d'attribut 'get_node'

stacktrace:

122  #pos = nx.spectral_layout(G) 
    123  #write_dot(G,'test.dot') 
--> 124  pos= graphviz_layout(G,prog='twopi',args='') 
    125  nx.draw_networkx(G, node_color=nodeColors, arrows=False, alpha=.8, labels=nodeLabels, font_size=8) 
    126  print(nx.info(G)) 

    246  This is a wrapper for pydot_layout. 
    247  """ 
--> 248  return pydot_layout(G=G,prog=prog,root=root,**kwds) 
    249 
    250 

    281  for n in G.nodes(): 
    282   pydot_node = pydotplus.Node(make_str(n)).get_name() 
--> 283   node=Q.get_node(pydot_node) 
    284 
    285   if isinstance(node,list): 

AttributeError: 'NoneType' object has no attribute 'get_node' 

Répondre

0

Sans comprendre plus sur le code, il est difficile de dire ce qui a causé le problème, mais ...

Basé sur le message d'erreur et le stacktrace, l'objet ' Q 'est défini sur None. Pour une raison quelconque, lorsque l'objet Q a été créé, le code a attribué la valeur None au lieu de la valeur désirée. Le dépannage nécessite un retour arrière pour savoir quand Q a été créé et pourquoi il a été réglé sur None.

--> 283 node=Q.get_node(pydot_node)

0

Il me semble que cela est une simple faute de frappe. Vous avez écrit Q où vous avez probablement voulu dire G. Il n'y a rien appelé Q, et donc Q.get_node n'a aucun sens. Cependant G.get_node aurait du sens.

+0

éternelle Je pense que si le 'Q' étaient simplement une faute de frappe, alors l'erreur serait: 'NameError: le nom 'Q' n'est pas défini' au lieu de: ' AttributeError: L'objet 'NoneType' n'a pas d'attribut 'get_node''. Le chemin d'exécution de Python doit détecter le fait que Q n'est pas défini avant de tenter de trouver un attribut sur cet objet. –

+0

Oui, vous avez raison. – Joel

0

La réponse de Joel peut ne pas être correct, puisque de la source, il montre que

P=to_pydot(G) 
if root is not None : 
    P.set("root",make_str(root)) 

D=P.create_dot(prog=prog) 

if D=="": # no data returned 
    print("Graphviz layout with %s failed"%(prog)) 
    print() 
    print("To debug what happened try:") 
    print("P=pydot_from_networkx(G)") 
    print("P.write_dot(\"file.dot\")") 
    print("And then run %s on file.dot"%(prog)) 
    return 

Q=pydotplus.graph_from_dot_data(D) 

node_pos={} 
for n in G.nodes(): 
    pydot_node = pydotplus.Node(make_str(n)).get_name() 
    node=Q.get_node(pydot_node) 

Alors Q ne joue aucun rôle direct avec le