Рендеринг дерева в python с помощью Anytree и graphviz. Не могу открыть файл

Этот вопрос основан на ответе Таруна для рендеринга дерева в python с использованием anytree и graphviz: https://stackoverflow.com/a/49442969/2139007

После установки graphviz и добавления его в мои переменные PATH я пытаюсь запустить следующий код Python:

DotExporter(nodes[0]["a"],
        nodeattrfunc=lambda node: 'label="{}"'.format(node.display_name)).to_picture("tree.png")

Приведенный выше код генерирует следующую ошибку:

  Error: dot: can't open C:\Users\username\AppData\Local\Temp\tmpa7t554le
Traceback (most recent call last):
  File "D:\mypath\tree.py", line 34, in <module>
    dot.to_picture('tree.png')
  File "C:\Users\username\AppData\Local\Programs\Python\Python36-32\lib\site-packages\anytree\exporter\dotexporter.py", line 229, in to_picture
    check_call(cmd)
  File "C:\Users\username\AppData\Local\Programs\Python\Python36-32\lib\subprocess.py", line 291, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['dot', 'C:\\Users\\username\\AppData\\Local\\Temp\\tmpa7t554le', '-T', 'png', '-o', 'tree.png']' returned non-zero exit status 2.

Проблема не возникает, если я запускаю команду точки 'dot tree.dot -T png -o tree.png' вручную из консоли после создания файла .dot

DotExporter(nodes[0]["a"],
        nodeattrfunc=lambda node: 'label="{}"'.format(node.display_name)).to_dotfile('tree.dot')

Есть ли способ решить эту проблему?


person luQ    schedule 25.09.2018    source источник
comment
Можете ли вы открыть C:\Users\username\AppData\Local\Temp\tmpa7t554le и посмотреть, что происходит   -  person Tarun Lalwani    schedule 11.10.2018
comment
Эй, спасибо за вашу помощь. На самом деле кажется, что файл tmp не создается. Поэтому он не отображается и недоступен через проводник Windows.   -  person luQ    schedule 15.10.2018
comment
Может быть проблема с доступом пользователя или что-то в этом роде? Попробуйте залезть внутрь кода DotExporter и посмотреть, что происходит   -  person Tarun Lalwani    schedule 15.10.2018


Ответы (2)


Я только что столкнулся с этой проблемой. После 2 часов отладки я обнаружил, что для Windows необходимо установить флаг удаления в значение False в dotexporter.py. Перейдите к строке 224 в «dotexporter.py» и внесите следующие изменения. Похоже на ошибку в исходном файле. Это сработало для меня:

 with NamedTemporaryFile("wb", delete=False) as dotfile:
person hshantanu    schedule 03.12.2018

Это как-то непреднамеренное поведение окон и дескриптора временного файла python. Просто используйте последнюю версию anytree (https://anytree.readthedocs.io/en/latest/< /а>). Он включает в себя исправление.

person c0fec0de    schedule 15.01.2020