pombreda / pydot

Automatically exported from code.google.com/p/pydot
MIT License
0 stars 0 forks source link

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

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
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 https://code.google.com/p/pydot/issues/detail?id=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
.')
>>>

Original issue reported on code.google.com by jmsa...@gmail.com on 28 Mar 2014 at 7:30

GoogleCodeExporter commented 9 years ago
Hello,

I have windows 7 32 bit and python 2.7

Here how I installed pydot for python

first I installed GraphViz using this link: 
http://www.graphviz.org/content/how-install-graphviz-windows-7-i-cant-find-set-f
ile
after that I installed Pyparsing then pydot (from this answer 
http://stackoverflow.com/questions/15951748/pydot-and-graphviz-error-couldnt-imp
ort-dot-parser-loading-of-dot-files-will)
     pip install -Iv https://pypi.python.org/packages/source/p/pyparsing/pyparsing-1.5.7.tar.gz#md5=9be0fcdcc595199c646ab317c1d9a709
      pip install pydot

After that when I tried this line of code:
      graph.write_png('test.png') 
I had a similar error:
 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
.')

I solved this problem by changing the function find_graphviz() in the pydot.py 
file, here is the code that I used:

def find_graphviz():
    if os.sys.platform == 'win32':

        if os.environ.has_key('PROGRAMFILES'):
            #Change to your path
            path =  "C:\Program Files\Graphviz2.30\\bin"

        else:

            #Just in case, try the default...
            path = r"C:\Program Files\Graphviz2.30\bin"

        progs = __find_executables(path)

        if progs is not None :

            #print "Used default install location"

            return progs

       return None

Hope it helps.
Cheers

Original comment by sara.ela...@gmail.com on 9 Feb 2015 at 5:29