Python ไม่สามารถสร้างกราฟต้นไม้โดยใช้ Graphviz กับแพ็คเกจ Anytree ได้

ดังนั้นฉันจึงติดตั้งแพ็คเกจ anytree แล้ว (หลังจากพยายามอย่างมาก ฉันต้องเพิ่มตัวแปรสภาพแวดล้อมบางอย่างในระบบของฉัน) เมื่อทำสิ่งนี้แล้ว ฉันสามารถใช้ฟังก์ชันเกือบทั้งหมดของแพ็คเกจ Anytree ได้ ไม่ใช่ฟังก์ชันที่ฉันต้องการ ฉันต้องการใช้ graphviz ร่วมกับแพ็คเกจ anytree เพื่อสร้างกราฟต้นไม้โดยใช้คำสั่ง 'DotExporter'

ฉันได้ติดตั้ง Graphviz; เส้นทางของมันคือ C:\Users\joel\Anaconda3_2\Lib\site-packages\graphviz และฉันยังได้เพิ่มบรรทัดของโค้ด 'from anytree.exporter import DotExporter' ลงในเอกสาร Python ของฉัน (นอกเหนือจากการนำเข้า anytree อื่น ๆ ที่จำเป็น เพื่อสร้างต้นไม้)

ดังนั้น เมื่อกำหนดโหนดรูท 'root' ของทรีของฉันแล้ว ตอนนี้ฉันควรจะสามารถสร้างไฟล์ png และจุดของทรีได้โดยใช้คำสั่ง 'DotExporter(root).to_picture('root.png')' อย่างใดอย่างหนึ่ง ฉันได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:

'FileNotFoundError: [WinError 2] ระบบไม่พบไฟล์ที่ระบุ'

ไม่มีใครรู้ว่าเกิดอะไรขึ้น? ฉันใช้ Python 3.6.2 กับเอ็นจิ้น Spyder ซึ่งเป็นส่วนหนึ่งของการกระจาย Anaconda (ฉันมี Anaconda 3.2) ฉันมั่นใจ 99% ว่าฉันมี Anytree และ Graphviz เวอร์ชันล่าสุด

อัปเดต: ดังนั้นฉันจึงได้เรียนรู้ว่ามีปัญหาความเข้ากันได้ใหญ่ระหว่าง Anaconda และ Graphviz มาเป็นเวลาประมาณหนึ่งปีแล้วและสันนิษฐานว่านี่คือปัญหา หลังจากลองวิธีแก้ปัญหาทั้งหมดที่มีคนแนะนำ ฉันยังไม่สามารถทำให้โปรแกรมทำงานได้ ฉันจึงลงเอยด้วยการถอนการติดตั้ง Anaconda และเริ่มใช้ PyCharm ร่วมกับล่าม Python มาตรฐานแทน อย่างไรก็ตาม โปรแกรมยังคงไม่ทำงาน ดังนั้นแม้ว่าจะมีปัญหาความเข้ากันได้ระหว่าง Anaconda และ Graphviz แต่ปรากฏว่านั่นไม่ใช่ปัญหา ฉันลองใช้โปรแกรมบนเครื่องของเพื่อนบ้านซึ่งใช้อนาคอนดาเหมือนกัน และพบข้อผิดพลาดแบบเดียวกับที่ฉันได้รับ

ในที่สุดฉันก็พบวิธีแก้ปัญหาต่อไปนี้: ฉันไม่สามารถรับคำสั่ง 'DotExporter(root).to_picture('root.png')' ให้ทำงานได้ แต่ใช้คำสั่ง 'DotExporter(root).to_dotfile('root.dot') ' คำสั่งกำลังทำงาน ไฟล์ '.dot' มีโค้ดและสามารถเปิดได้ใน Notepad (โปรแกรมประมวลผลคำอื่นๆ ก็ใช้งานได้เช่นกัน) ดังนั้นฉันจึงต้องหาวิธีสร้างกราฟต้นไม้โดยใช้ไฟล์ dot แทนที่จะใช้คำสั่ง 'DotExporter(root).to_picture('root.png')' วิธีที่ง่ายที่สุดในการดำเนินการนี้คือผ่านเครื่องมือออนไลน์อย่างใดอย่างหนึ่ง http://www.webgraphviz.com/ และ http://sandbox.kidstrythisathome.com/erdos/ เพียงเปิดไฟล์ dot ของคุณใน Notepad คัดลอกเนื้อหาและวางลงในเว็บไซต์แล้วกดสร้าง


person Joel Brennan    schedule 20.07.2018    source แหล่งที่มา
comment
ทำไมคุณถึงมั่นใจ 99%? ควรจะเป็น 100% :)   -  person Yuca    schedule 20.07.2018
comment
โอเค ฉันเพิ่งตรวจสอบ และตอนนี้ก็มั่นใจ 100% แล้ว   -  person Joel Brennan    schedule 20.07.2018
comment
คุณอาจต้องติดตั้งแพ็คเกจ python-graphviz ด้วย เห็นได้ชัดว่านี่เป็นเรื่องยุ่งเล็กน้อย: github.com/ContinuumIO/anaconda-issues/ ประเด็น/1666   -  person darthbith    schedule 21.07.2018
comment
@darthbith น่าเสียดายที่ใช้งานไม่ได้ ฉันอ่านกระทู้ทั้งหมดที่คุณเชื่อมโยงโดยลองใช้วิธีแก้ไขปัญหาที่เสนอทั้งหมด (ซึ่งมีเพียงประมาณ 2 หรือ 3 รายการเท่านั้น และโพสต์ที่เหลือก็มีคนบ่น) และไม่พบสิ่งใดที่ได้ผล เมื่อพิจารณาถึงปัญหาความไม่เข้ากันของ Anaconda และ Graphviz ปัญหานี้มีอายุยืนยาว ฉันตัดสินใจว่าฉันจะถอนการติดตั้ง Anaconda และใช้การกระจายอื่น...   -  person Joel Brennan    schedule 21.07.2018
comment
...ฉันไม่มีความชอบส่วนตัวสำหรับอนาคอนด้า มันเป็นเพียงการกระจายที่มหาวิทยาลัยของฉันให้ฉันติดตั้ง และฉันวางแผนที่จะเปลี่ยนไปใช้กลไก Python ที่รองรับการเรียกใช้โค้ดทีละบรรทัดสำหรับการดีบักอยู่แล้ว ฉันขอแนะนำให้ใครก็ตามที่ไม่เชี่ยวชาญด้านเทคโนโลยีเป็นพิเศษและกำลังประสบปัญหาเดียวกันกับ Anaconda และ Graphviz ให้ทำเช่นเดียวกัน   -  person Joel Brennan    schedule 21.07.2018


คำตอบ (1)


นี่คือวิธีแก้ปัญหาของฉัน ฉันใช้ตัวอย่างของ "เริ่มต้นใช้งาน" ด้วยขั้นตอนเริ่มต้นต่อไปนี้:

สร้างวัตถุต้นไม้เป็น udo จากนั้นลอง DotExporter(udo).to_picture("udo.png") นี่คือจุดที่ฉันได้รับข้อผิดพลาดเดียวกันกับ OP

สมมติว่าคุณได้ติดตั้ง graphviz และ python-graphviz (เช่น conda install -c anaconda graphviz python-graphviz) แล้ว คุณสามารถส่งออกกราฟ (ขั้นแรกให้บันทึก dotfile) ด้วยสิ่งนี้:

DotExporter(udo).to_dotfile('udo.dot')

from graphviz import Source
Source.from_file('udo.dot')

จากนั้นบันทึกไฟล์รูปภาพด้วย:

from graphviz import render
render('dot', 'png', 'udo.dot') 
person Erik    schedule 06.02.2019