Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在agraph.py中将字符串传递给agedge。networkx和pygraphviz出现问题_Python_C_Swig_Graphviz_Networkx - Fatal编程技术网

Python 在agraph.py中将字符串传递给agedge。networkx和pygraphviz出现问题

Python 在agraph.py中将字符串传递给agedge。networkx和pygraphviz出现问题,python,c,swig,graphviz,networkx,Python,C,Swig,Graphviz,Networkx,给出这个初始图: import networkx as nx G=nx.MultiGraph() fromnodes=[0,0,1,1,1,1,1,2,3,4,5,5,5,7,8,9,10] tonodes=[1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] dupedgeind=0 for x,y in zip(fromnodes,tonodes): if G.has_edge(x,y): dupedgeind=dupedgeind+1

给出这个初始图:

import networkx as nx
G=nx.MultiGraph()
fromnodes=[0,0,1,1,1,1,1,2,3,4,5,5,5,7,8,9,10]
tonodes=[1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
dupedgeind=0
for x,y in zip(fromnodes,tonodes):
    if G.has_edge(x,y):
        dupedgeind=dupedgeind+1
        G.add_edge(x,y,key=dupedgeind)
    else:
        dupedgeind=0
        G.add_edge(x,y,key=dupedgeind)
有人能重现这个错误吗

pos=nx.nx_agraph.pygraphviz_layout(G,prog='sfdp')

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\networkx\drawing\nx_agraph.py", line 262, in pygraphviz_layout
    A=to_agraph(G)
  File "C:\Python27\lib\site-packages\networkx\drawing\nx_agraph.py", line 155, in to_agraph
    A.add_edge(u,v,key=str(key),**str_edgedata)
  File "C:\Python27\lib\site-packages\pygraphviz\agraph.py", line 484, in add_edge
    eh = gv.agedge(self.handle, uh, vh, key, _Action.find)
KeyError: 'agedge: no key'

它不再失败(但会丢失密钥标签)

是否有一种明显的方法来修复此问题(以便保留
参数值)-我尝试的任何方法似乎都不起作用

接下来最明智的调试步骤是什么?


从中,似乎
c
agedge函数(我看不出来,因为它是在.pyd二进制文件中)具有以下格式:

*agedge(Agraph_t *g, Agnode_t *t, Agnode_t *h, char *name, int createflag)
其中,
char*name
是键

我无法理解为什么它不接受初始错误中的
str
dtype


注:版本:

networkx-1.11, pygraphviz-1.3.1 (安装于) 在Windows7(64位)上的Python 2.7(32位-通过Python(x,y)输入),GraphViz-2.38

我也在这些问题中看到了这个问题:


更新1

我已尝试将agedge函数的
输入调整为字符数组的多种变体(例如
(ct.c_char_p*len(key))(key)
(ct是基于ctypes模块)。这会将错误更改为:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\networkx\drawing\nx_agraph.py", line 262, in pygraphviz_layout
    A=to_agraph(G)
  File "C:\Python27\lib\site-packages\networkx\drawing\nx_agraph.py", line 155, in to_agraph
    A.add_edge(u,v,str(key),**str_edgedata)
  File "C:\Python27\lib\site-packages\pygraphviz\agraph.py", line 482, in add_edge
    eh = gv.agedge(self.handle, uh, vh, (ct.c_char_p * len(key))(key), _Action.create)
TypeError: in method 'agedge', argument 4 of type 'char *'

我不知道为什么仅仅对字符串
str(key)
进行强制转换不起作用

更新3-使用功能进行编辑

在这里找到函数-

更新4:

错误源位于pygraphviz文件graphviz_wrap.c第3921行:

SWIGINTERN PyObject *_wrap_agedge(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
    PyObject *resultobj = 0;
    Agraph_t *arg1 = (Agraph_t *) 0 ;
    Agnode_t *arg2 = (Agnode_t *) 0 ;
    Agnode_t *arg3 = (Agnode_t *) 0 ;
    char *arg4 = (char *) 0 ;
    int arg5 ;
    void *argp1 = 0 ;
    int res1 = 0 ;
    void *argp2 = 0 ;
    int res2 = 0 ;
    void *argp3 = 0 ;
    int res3 = 0 ;
    int res4 ;
    char *buf4 = 0 ;
    int alloc4 = 0 ;
    int val5 ;
    int ecode5 = 0 ;
    PyObject * obj0 = 0 ;
    PyObject * obj1 = 0 ;
    PyObject * obj2 = 0 ;
    PyObject * obj3 = 0 ;
    PyObject * obj4 = 0 ;
    Agedge_t *result = 0 ;

    if (!PyArg_ParseTuple(args, char*)"OOOOO:agedge",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; 
    res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Agraph_t, 0 | 0 );
    if (!SWIG_IsOK(res1)) {
        SWIG_exception_fail(SWIG_ArgError(res1), "in method '""agedge" "', argument " "1"" of type '" "Agraph_t *""'");
    }
    arg1 = (Agraph_t *)(argp1);
    res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_Agnode_t, 0 | 0 );
    if (!SWIG_IsOK(res2)) {
        SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "agedge" "', argument " "2"" of type '" "Agnode_t *""'");
    }
    arg2 = (Agnode_t *)(argp2);
    res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_Agnode_t, 0 | 0 );
    if (!SWIG_IsOK(res3)) {
        SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "agedge" "', argument " "3"" of type '" "Agnode_t *""'");
    }
    arg3 = (Agnode_t *)(argp3);
    res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4);
    if (!SWIG_IsOK(res4)) {
        SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "agedge" "', argument " "4"" of type '" "char *""'");
    }
    arg4 = (char *)(buf4);
    ecode5 = SWIG_AsVal_int(obj4, &val5);
    if (!SWIG_IsOK(ecode5)) {
        SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "agedge" "', argument " "5"" of type '" "int""'");
    }
    arg5 = (int)(val5);
    {
        result = (Agedge_t *)agedge(arg1,arg2,arg3,arg4,arg5);
        if (!result) {
            PyErr_SetString(PyExc_KeyError,"agedge: no key");
            return NULL;
        }
    }
    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Agedge_t, 0 | 0 );
    if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
    return resultobj;
    fail:
        if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
        return NULL;
}
或者,在graphviz.i,第68行


无论哪种方式,如果
agedge
由于任何原因失败,似乎会返回错误字符串“agedge:no key”。。。也许这与SWIG有关。

尝试将变量名从“key”更改为类似“temp\u key”的其他名称。我的意思是,您(或任何以前导入的模块)可能在…之前声明了一个非字符串类型的“key”变量

显然,如果运行:

eh = gv.agedge(self.handle, uh, vh, key , _Action.create)
失败但正在运行:

eh = gv.agedge(self.handle, uh, vh, "key" , _Action.create)
没有问题,它只能与“key”变量类型相关。。你试过这个吗:

eh = gv.agedge(self.handle, uh, vh, str(key) , _Action.create)
eh=gv.agedge(self.handle,呃,vh,unicode(键),\u Action.create)

在原始代码中集成str()/unicode(),给出:

import networkx as nx
G=nx.MultiGraph()
fromnodes=[0,0,1,1,1,1,1,2,3,4,5,5,5,7,8,9,10]
tonodes=[1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
dupedgeind=0
for x,y in zip(fromnodes,tonodes):
    if G.has_edge(x,y):
        dupedgeind=dupedgeind+1
        G.add_edge(x,y,key=str(dupedgeind))
        #G.add_edge(x,y,key=unicode(dupedgeind))
    else:
        dupedgeind=0
        G.add_edge(x,y,key=str(dupedgeind))
        #G.add_edge(x,y,key=unicode(dupedgeind))
两者(str和unicode版本)在Linux上都可以正常工作


致以最诚挚的问候

只是一个黑暗中的镜头,你是否尝试过将你的钥匙铸入字符串:
G.add_edge(x,y,key=str(dupedgeind))
?@atomh33ls我相信你有一些奇怪的环境问题。你的代码在我的电脑上运行得很好。我使用的是
networkx==1.11
pygraphviz==1.3.1
和graphviz
2.38.0
。您是否尝试在虚拟环境中运行代码?我还可以验证代码是否适用于我
networkx-1.11
pygraphviz-1.3.1
graphviz-2.38.0
。我的操作系统是Linux。也许有些东西弄错了?@atomh33ls您也可以尝试在这里获取pygraphviz和其他windows库。试试“官方CPython发行版”怎么样正如您从何处获得pygraphviz二进制文件的建议一样?此处的错误完全相同:看起来似乎与Microsoft Windows软件包安装/编译问题有关。谢谢-我也在问题中添加了该链接。您能否详细说明问题可能是什么?该问题似乎与变量“类型”或变量“类型转换”错误有关。因为如果在add_edge func中为key arg添加一个实数常量字符串参数,则不会出现错误。
SWIGINTERN PyObject *_wrap_agedge(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
    PyObject *resultobj = 0;
    Agraph_t *arg1 = (Agraph_t *) 0 ;
    Agnode_t *arg2 = (Agnode_t *) 0 ;
    Agnode_t *arg3 = (Agnode_t *) 0 ;
    char *arg4 = (char *) 0 ;
    int arg5 ;
    void *argp1 = 0 ;
    int res1 = 0 ;
    void *argp2 = 0 ;
    int res2 = 0 ;
    void *argp3 = 0 ;
    int res3 = 0 ;
    int res4 ;
    char *buf4 = 0 ;
    int alloc4 = 0 ;
    int val5 ;
    int ecode5 = 0 ;
    PyObject * obj0 = 0 ;
    PyObject * obj1 = 0 ;
    PyObject * obj2 = 0 ;
    PyObject * obj3 = 0 ;
    PyObject * obj4 = 0 ;
    Agedge_t *result = 0 ;

    if (!PyArg_ParseTuple(args, char*)"OOOOO:agedge",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; 
    res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Agraph_t, 0 | 0 );
    if (!SWIG_IsOK(res1)) {
        SWIG_exception_fail(SWIG_ArgError(res1), "in method '""agedge" "', argument " "1"" of type '" "Agraph_t *""'");
    }
    arg1 = (Agraph_t *)(argp1);
    res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_Agnode_t, 0 | 0 );
    if (!SWIG_IsOK(res2)) {
        SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "agedge" "', argument " "2"" of type '" "Agnode_t *""'");
    }
    arg2 = (Agnode_t *)(argp2);
    res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_Agnode_t, 0 | 0 );
    if (!SWIG_IsOK(res3)) {
        SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "agedge" "', argument " "3"" of type '" "Agnode_t *""'");
    }
    arg3 = (Agnode_t *)(argp3);
    res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4);
    if (!SWIG_IsOK(res4)) {
        SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "agedge" "', argument " "4"" of type '" "char *""'");
    }
    arg4 = (char *)(buf4);
    ecode5 = SWIG_AsVal_int(obj4, &val5);
    if (!SWIG_IsOK(ecode5)) {
        SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "agedge" "', argument " "5"" of type '" "int""'");
    }
    arg5 = (int)(val5);
    {
        result = (Agedge_t *)agedge(arg1,arg2,arg3,arg4,arg5);
        if (!result) {
            PyErr_SetString(PyExc_KeyError,"agedge: no key");
            return NULL;
        }
    }
    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Agedge_t, 0 | 0 );
    if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
    return resultobj;
    fail:
        if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
        return NULL;
}
eh = gv.agedge(self.handle, uh, vh, key , _Action.create)
eh = gv.agedge(self.handle, uh, vh, "key" , _Action.create)
eh = gv.agedge(self.handle, uh, vh, str(key) , _Action.create)
import networkx as nx
G=nx.MultiGraph()
fromnodes=[0,0,1,1,1,1,1,2,3,4,5,5,5,7,8,9,10]
tonodes=[1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
dupedgeind=0
for x,y in zip(fromnodes,tonodes):
    if G.has_edge(x,y):
        dupedgeind=dupedgeind+1
        G.add_edge(x,y,key=str(dupedgeind))
        #G.add_edge(x,y,key=unicode(dupedgeind))
    else:
        dupedgeind=0
        G.add_edge(x,y,key=str(dupedgeind))
        #G.add_edge(x,y,key=unicode(dupedgeind))