美文网首页
【windows】Failed to import pydot.

【windows】Failed to import pydot.

作者: 我的章鱼小丸子呢 | 来源:发表于2020-08-07 22:16 被阅读0次

    背景

    anaconda虚拟环境+windows10+python3.6.10+tensorflow2.2.0

    错误1:Failed to import pydot. You must install pydot and graphviz for pydotprint to work.

    错误1错误出错点:

    使用plot_model将模型导出文件时报错。

    from tensorflow.keras.utils import plot_model
    plot_model(model, to_file='model.png')
    

    Failed to import pydot. You must install pydot and graphviz for pydotprint to work.

    错误1原因:

    找不到pydot、graphviz。

    错误1解决:

    (1)安装pydot(pydot_ng或者pydotplus)

    pip install pydot
    pip install pydot_ng
    pip install pydotplus
    

    注意:有的教程说不能安装pydot,需要安装pydot_ng,我个人觉得这是不正确的说法,至少不能解决我的问题。
    这三个安装任意一个都可以,根据源码(envs\dlpy\Lib\site-packages\tensorflow\python\keras\utils\vis_utils.py文件):

    try:  
      print("aaaa")
      # pydot-ng is a fork of pydot that is better maintained.
      import pydot_ng as pydot
    except ImportError:
      # pydotplus is an improved version of pydot
      try:
        import pydotplus as pydot
      except ImportError:
        # Fall back on pydot if necessary.
        try:
          import pydot
        except ImportError:
          pydot = None
    

    可以看到这里会去依次尝试导入pydot_ng、pydotplus、pydot,所以下载哪个都是一样的。

    (2)安装graphviz

    • 官网地址,我这里下载的是graphviz-install-2.44.1-win64
    • 下载完成后,点击exe文件进行安装。(注意安装路径)
    • 安装成功后,添加环境变量。(上一步中的路径,我这里是C:\Program Files\Graphviz 2.44.1\bin)


      添加环境变量

    (3)重新激活anaconda虚拟环境,测试graphviz是否可以使用。

    dot -version
    

    出现graphviz版本信息:


    graphviz版本信息

    错误2:GraphViz's executables not found

    错误2出错点:

    找不到GraphViz


    GraphViz's executables not found
    错误2原因:

    根据源码,判定graphviz路径有问题。

    def find_graphviz():
        """Locate Graphviz's executables in the system.
    
        Tries three methods:
    
        First: Windows Registry (Windows only)
        This requires Mark Hammond's pywin32 is installed.
    
        Secondly: Search the path
        It will look for 'dot', 'twopi' and 'neato' in all the directories
        specified in the PATH environment variable.
    
        Thirdly: Default install location (Windows only)
        It will look for 'dot', 'twopi' and 'neato' in the default install
        location under the "Program Files" directory.
    
        It will return a dictionary containing the program names as keys
        and their paths as values.
    
        If this fails, it returns None.
        """
    
        # Method 1 (Windows only)
        if os.sys.platform == 'win32':
    
            HKEY_LOCAL_MACHINE = 0x80000002
            KEY_QUERY_VALUE = 0x0001
    
            RegOpenKeyEx = None
            RegQueryValueEx = None
            RegCloseKey = None
    
            try:
                import win32api
                RegOpenKeyEx = win32api.RegOpenKeyEx
                RegQueryValueEx = win32api.RegQueryValueEx
                RegCloseKey = win32api.RegCloseKey
    
            except ImportError:
                # Print a messaged suggesting they install these?
                pass
    
            try:
                import ctypes
    
                def RegOpenKeyEx(key, subkey, opt, sam):
                    result = ctypes.c_uint(0)
                    ctypes.windll.advapi32.RegOpenKeyExA(key, subkey, opt, sam,
                                                         ctypes.byref(result))
                    return result.value
    
                def RegQueryValueEx(hkey, valuename):
                    data_type = ctypes.c_uint(0)
                    data_len = ctypes.c_uint(1024)
                    data = ctypes.create_string_buffer(1024)
    
                    # this has a return value, which we should probably check
                    ctypes.windll.advapi32.RegQueryValueExA(
                        hkey, valuename, 0, ctypes.byref(data_type),
                        data, ctypes.byref(data_len))
    
                    return data.value
    
                RegCloseKey = ctypes.windll.advapi32.RegCloseKey
    
            except ImportError:
                # Print a messaged suggesting they install these?
                pass
    
            if RegOpenKeyEx is not None:
                # Get the GraphViz install path from the registry
                hkey = None
                potentialKeys = [
                    "SOFTWARE\\ATT\\Graphviz",
                    "SOFTWARE\\AT&T Research Labs\\Graphviz"]
                for potentialKey in potentialKeys:
    
                    try:
                        hkey = RegOpenKeyEx(
                            HKEY_LOCAL_MACHINE,
                            potentialKey, 0, KEY_QUERY_VALUE)
    
                        if hkey is not None:
                            path = RegQueryValueEx(hkey, "InstallPath")
                            RegCloseKey(hkey)
    
                            # The regitry variable might exist, left by
                            # old installations but with no value, in those cases
                            # we keep searching...
                            if not path:
                                continue
    
                            # Now append the "bin" subdirectory:
                            path = os.path.join(path, "bin")
                            progs = __find_executables(path)
                            if progs is not None:
                                return progs
    
                    except Exception:
                        pass
                    else:
                        break
    
        # Method 2 (Linux, Windows etc)
        if 'PATH' in os.environ:
            for path in os.environ['PATH'].split(os.pathsep):
                progs = __find_executables(path)
                if progs is not None:
                    return progs
    
    
        # Method 3 (Windows only)
        if os.sys.platform == 'win32':
    
            # Try and work out the equivalent of "C:\Program Files" on this
            # machine (might be on drive D:, or in a different language)
            if 'PROGRAMFILES' in os.environ:
                # Note, we could also use the win32api to get this
                # information, but win32api may not be installed.
                path = os.path.join(os.environ['PROGRAMFILES'], 'ATT',
                                    'GraphViz', 'bin')
            else:
                # Just in case, try the default...
                path = r"C:\Program Files\att\Graphviz\bin"
    
            progs = __find_executables(path)
    
            if progs is not None:
                return progs
    
        for path in (
                '/usr/bin', '/usr/local/bin',
                '/opt/local/bin',
                '/opt/bin', '/sw/bin', '/usr/share',
                '/Applications/Graphviz.app/Contents/MacOS/'):
    
            progs = __find_executables(path)
            if progs is not None:
                return progs
    
        # Failed to find GraphViz
        return None
    
    错误2解决方法:

    在上面的方法中手动写入graphviz路径,我这里是C:\Program Files\Graphviz 2.44.1\bin

    
        path = r"C:\Program Files\Graphviz 2.44.1\bin"
        progs = __find_executables(path)
        if progs is not None:
            return progs
    

    修改完后的该方法为:

    def find_graphviz():
        """Locate Graphviz's executables in the system.
    
        Tries three methods:
    
        First: Windows Registry (Windows only)
        This requires Mark Hammond's pywin32 is installed.
    
        Secondly: Search the path
        It will look for 'dot', 'twopi' and 'neato' in all the directories
        specified in the PATH environment variable.
    
        Thirdly: Default install location (Windows only)
        It will look for 'dot', 'twopi' and 'neato' in the default install
        location under the "Program Files" directory.
    
        It will return a dictionary containing the program names as keys
        and their paths as values.
    
        If this fails, it returns None.
        """
    
        # Method 1 (Windows only)
        if os.sys.platform == 'win32':
    
            HKEY_LOCAL_MACHINE = 0x80000002
            KEY_QUERY_VALUE = 0x0001
    
            RegOpenKeyEx = None
            RegQueryValueEx = None
            RegCloseKey = None
    
            try:
                import win32api
                RegOpenKeyEx = win32api.RegOpenKeyEx
                RegQueryValueEx = win32api.RegQueryValueEx
                RegCloseKey = win32api.RegCloseKey
    
            except ImportError:
                # Print a messaged suggesting they install these?
                pass
    
            try:
                import ctypes
    
                def RegOpenKeyEx(key, subkey, opt, sam):
                    result = ctypes.c_uint(0)
                    ctypes.windll.advapi32.RegOpenKeyExA(key, subkey, opt, sam,
                                                         ctypes.byref(result))
                    return result.value
    
                def RegQueryValueEx(hkey, valuename):
                    data_type = ctypes.c_uint(0)
                    data_len = ctypes.c_uint(1024)
                    data = ctypes.create_string_buffer(1024)
    
                    # this has a return value, which we should probably check
                    ctypes.windll.advapi32.RegQueryValueExA(
                        hkey, valuename, 0, ctypes.byref(data_type),
                        data, ctypes.byref(data_len))
    
                    return data.value
    
                RegCloseKey = ctypes.windll.advapi32.RegCloseKey
    
            except ImportError:
                # Print a messaged suggesting they install these?
                pass
    
            if RegOpenKeyEx is not None:
                # Get the GraphViz install path from the registry
                hkey = None
                potentialKeys = [
                    "SOFTWARE\\ATT\\Graphviz",
                    "SOFTWARE\\AT&T Research Labs\\Graphviz"]
                for potentialKey in potentialKeys:
    
                    try:
                        hkey = RegOpenKeyEx(
                            HKEY_LOCAL_MACHINE,
                            potentialKey, 0, KEY_QUERY_VALUE)
    
                        if hkey is not None:
                            path = RegQueryValueEx(hkey, "InstallPath")
                            RegCloseKey(hkey)
    
                            # The regitry variable might exist, left by
                            # old installations but with no value, in those cases
                            # we keep searching...
                            if not path:
                                continue
    
                            # Now append the "bin" subdirectory:
                            path = os.path.join(path, "bin")
                            progs = __find_executables(path)
                            if progs is not None:
                                return progs
    
                    except Exception:
                        pass
                    else:
                        break
    
        # Method 2 (Linux, Windows etc)
        if 'PATH' in os.environ:
            for path in os.environ['PATH'].split(os.pathsep):
                progs = __find_executables(path)
                if progs is not None:
                    return progs
    
        path = r"C:\Program Files\Graphviz 2.44.1\bin"
        progs = __find_executables(path)
        if progs is not None:
            return progs
    
        # Method 3 (Windows only)
        if os.sys.platform == 'win32':
    
            # Try and work out the equivalent of "C:\Program Files" on this
            # machine (might be on drive D:, or in a different language)
            if 'PROGRAMFILES' in os.environ:
                # Note, we could also use the win32api to get this
                # information, but win32api may not be installed.
                path = os.path.join(os.environ['PROGRAMFILES'], 'ATT',
                                    'GraphViz', 'bin')
            else:
                # Just in case, try the default...
                path = r"C:\Program Files\att\Graphviz\bin"
    
            progs = __find_executables(path)
    
            if progs is not None:
                return progs
    
        for path in (
                '/usr/bin', '/usr/local/bin',
                '/opt/local/bin',
                '/opt/bin', '/sw/bin', '/usr/share',
                '/Applications/Graphviz.app/Contents/MacOS/'):
    
            progs = __find_executables(path)
            if progs is not None:
                return progs
    
        # Failed to find GraphViz
        return None
    

    错误3:pydot_ng.InvocationException:Program terminated with status:1. stderr follows: Format:“ps” not

    错误3原因:
    错误3原因
    错误3解决方法:
    dot -c
    
    结果

    重新运行代码,可以正常使用。

    正常使用

    参考

    相关文章

      网友评论

          本文标题:【windows】Failed to import pydot.

          本文链接:https://www.haomeiwen.com/subject/oqvqdktx.html