pygraphviz 1.5 по умолчанию края нет стрелки? - PullRequest
1 голос
/ 16 марта 2019

Я обновился до pygraphviz 1.5, используя это колесо здесь Установка pygraphviz в Windows 10 64-bit, Python 3.6 .

У меня проблемы с этим.

import pygraphviz as pgv

G = pgv.AGraph()

G.add_node('a')
G.add_node('b')
G.add_edge('a', 'b')
g_string = G.string()

print(g_string)

дает мне

strict digraph {
    a -- b;
}

, в то время как тот же код, что и в предыдущей версии 1.3, дает мне

strict digraph {
    a -> b;
}

Я даже пытался

G.add_edge('a', 'b', arrowhead="normal"), который дает a -- b [arrowhead=normal];, но рисует без стрелок.

Я бегу graphviz 2.38.pygraphviz 1.3 на питоне 2.7.pygraphviz 1.5 на питоне 3.6.

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Я хочу начать с указания, что для того, чтобы этот пример работал, недостаточно , чтобы установить PyGraphviz установленный модуль (отметьте [SO]: Установкаpygraphviz в Windows 10 64-bit, Python 3.6 (ответ @ CristiFati) ), но требуется также версия Graphviz , так как PyGraphviz использует один из своих инструментов (называется нет ).
Он доступен для скачивания, во всяком случае, я решил его построить (для 32-бит , но это не актуально).

Кроме того, я протестировал с 2 .whl s:

  • Один (который я) построил для Python 3,6 (64 бита)
  • Один построен для Python 2.7 (64 бита)

Поскольку у меня была возможность изменить их (для целей отладки), я не pip install их, а скорее распаковал их в cwd (для этого потребовался дополнительный код):

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055196206]> dir /b
code.py
pygraphviz131_27
pygraphviz15_36

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055196206]> tree /a
Folder PATH listing for volume Work
Volume serial number is 3655-6FED
E:.
+---pygraphviz131_27
|   \---pygraphviz
|       \---tests
\---pygraphviz15_36
    \---pygraphviz
        \---tests

code.py :

#!/usr/bin/env python3

import sys


# @TODO - cfati: The 5 lines below are because I unpacked the 2 `.whl`s in the current dir, instead of `pip install`ing them
maj, min = sys.version_info[:2]
if maj == 3 and min == 6:
    sys.path.insert(0, "pygraphviz15_36")
elif maj == 2 and min == 7:
    sys.path.insert(0, "pygraphviz131_27")
# @TODO end

import pygraphviz as pgv


def main():
    print(pgv)
    g = pgv.AGraph(directed=len(sys.argv) > 1)
    g.add_node("a")
    g.add_node("b")
    g.add_edge("a", "b")
    #print(dir(g))
    g_string = g.string()  # Nice var name, btw :)
    print(g_string)


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()

Выход :

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055196206]> set PATH=%PATH%;e:\Work\Dev\Fati\WinBuild\graphviz\src\graphviz\Release\Graphviz\bin

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055196206]> "e:\Work\Dev\VEnvs\py_064_02.07.15_test0\Scripts\python.exe" code.py
Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)] on win32

<module 'pygraphviz' from 'pygraphviz131_27\pygraphviz\__init__.pyc'>
strict digraph {
        a -> b;
}


[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055196206]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" code.py
Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32

<module 'pygraphviz' from 'pygraphviz15_36\\pygraphviz\\__init__.py'>
strict graph "" {
        a -- b;
}

Как видно, проблема легко воспроизводима.Теперь выходы - против -> выглядят очень много, как ябудет представлять ненаправленный против направленного графа .Я посмотрел в исходном коде и нашел что-то странное.

[GitHub.PyGraphviz 1.5]: класс AGraph ( вещь = нет, имя файла = нет, данные = нет, string = None, handle = None, name = '', строго = True, направлено = False, ** attr ) имеет аргумент directed=False.Установка True , исправила проблему.

Вывод :

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055196206]> "e:\Work\Dev\VEnvs\py_064_02.07.15_test0\Scripts\python.exe" code.py dummy_arg
Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)] on win32

<module 'pygraphviz' from 'pygraphviz131_27\pygraphviz\__init__.pyc'>
strict digraph {
        a -> b;
}


[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055196206]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" code.py dummy_arg
Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32

<module 'pygraphviz' from 'pygraphviz15_36\\pygraphviz\\__init__.py'>
strict digraph "" {
        a -> b;
}

Я сказал, что обнаружил что-тостранно: хорошо для PyGraphviz 1.3.1 все то же самое : directed=False (код и doc), но все же каким-то образом инициализируетсяграфик , как было бы направлено .
Быстрая проверка agraph.py (в 2-х версиях пакета) не показала, откуда возникла эта разница, поэтому я могу смело предположить, что это из-за пакета Graphviz версии, с которыми были построены версии 2 PyGraphviz .

Тем не менее, PyGraphviz 1.5 (построено мной) является правильным .

1 голос
/ 16 марта 2019

В качестве документов указано , по умолчанию AGraph является ненаправленным. Вам нужно будет указать атрибут directed=True во время построения графика:

>>> G = pgv.AGraph(directed=True)
>>> G.add_node('a')
>>> G.add_node('b')
>>> G.add_edge('a', 'b')
>>> g_string = G.string()
>>>
>>> print(g_string)
strict digraph "" {
    a -> b;
}
...