pydot / pydot-ng

Python interface to Graphviz's Dot language compatible with Python 2 nad Python 3
MIT License
22 stars 10 forks source link

[91] GraphViz's executables not found on Windows 7 64-bit if user installs them in a custom directory #27

Closed prmtl closed 5 years ago

prmtl commented 9 years ago

Reported by jmsa...@gmail.com, 2014-03-28T20:30:27Z

I am running Windows 7 64-bit. I installed graphviz-2.36.msi from http://www.graphviz.org/Download_windows.php but I install most programs to c:\app rather than c:\Program Files, and I get this message (see below). One problem is that there is no SOFTWARE\ATT registry key anymore. (perhaps related to #65)

I think the bigger problem is that this discovery mechanism is a cat-and-mouse game with whatever the graphviz folks do.

===> Could you please add a function so that end-users can just set the graphviz path manually through whatever mechanism they see fit?

For now I'm just monkeypatching the pydot module:

def force_find_graphviz(graphviz_root):
   binpath = os.path.join(graphviz_root, 'bin')
   programs = 'dot twopi neato circo fdp sfdp'
   def helper():
     for prg in programs.split():
       if os.path.exists(os.path.join(binpath, prg)):
         yield ((prg, os.path.join(binpath, prg)))
       elif os.path.exists(os.path.join(binpath, prg+'.exe')):
         yield ((prg, os.path.join(binpath, prg+'.exe')))
   progdict = dict(helper())
   return lambda: progdict

pydot.find_graphviz = force_find_graphviz('c:/app/util/graphviz/2.36')
C:\tmp\blockdiag>python
Python 2.7.5 |Anaconda 1.9.1 (64-bit)| (default, May 31 2013, 10:45:37) [MSC v.1
500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pydot
Couldn't import dot_parser, loading of dot files will not be possible.
>>> graph = pydot.Dot(graph_type='graph')
>>> graph.write_png('test.png')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\app\python\anaconda\1.6.0\lib\site-packages\pydot.py", line 1602, in
<lambda>
    lambda path, f=frmt, prog=self.prog : self.write(path, format=f, prog=prog))

  File "c:\app\python\anaconda\1.6.0\lib\site-packages\pydot.py", line 1696, in
write
    dot_fd.write(self.create(prog, format))
  File "c:\app\python\anaconda\1.6.0\lib\site-packages\pydot.py", line 1724, in
create
    self.progs = find_graphviz()
  File "c:\app\python\anaconda\1.6.0\lib\site-packages\pydot.py", line 409, in f
ind_graphviz
    "SOFTWARE\ATT\Graphviz", 0, win32con.KEY_QUERY_VALUE )
pywintypes.error: (2, 'RegOpenKeyEx', 'The system cannot find the file specified
.')
>>>

From: https://code.google.com/p/pydot/issues/detail?id=91

prmtl commented 5 years ago

There is Dot.set_graphviz_executables that does exactly that.