You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

_env_initlization.py 3.9 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. # -*- coding: utf-8 -*-
  2. import ctypes
  3. import glob
  4. import logging
  5. import os
  6. import sys
  7. from ctypes import *
  8. def check_pip_env():
  9. filter_package_name = 'megbrain'
  10. need_package_name = 'megengine'
  11. import pkg_resources
  12. installed_packages = pkg_resources.working_set
  13. installed_packages_list = sorted(["%s" % i.key.lower() for i in installed_packages])
  14. assert (
  15. filter_package_name not in installed_packages_list
  16. ), "Your python packages may be corrupted by installing internal&external versions at the same time. To fix it, try to uninstall {} and {}, then install {} again".format(
  17. filter_package_name, need_package_name, need_package_name
  18. )
  19. assert (
  20. "megenginelite" not in installed_packages_list
  21. ), "Your python packages may be corrupted by installing internal&external versions at the same time. To fix it, try to uninstall megenginelite and {}, then install {} again".format(
  22. need_package_name, need_package_name
  23. )
  24. def check_windows():
  25. if sys.platform == "win32":
  26. lib_path = os.path.join(os.path.dirname(__file__), "../megengine/core/lib")
  27. dll_paths = list(filter(os.path.exists, [lib_path,]))
  28. assert len(dll_paths) > 0
  29. kernel32 = ctypes.WinDLL("kernel32.dll", use_last_error=True)
  30. has_load_library_attr = hasattr(kernel32, "AddDllDirectory")
  31. old_error_mode = kernel32.SetErrorMode(0x0001)
  32. kernel32.LoadLibraryW.restype = ctypes.c_void_p
  33. if has_load_library_attr:
  34. kernel32.AddDllDirectory.restype = ctypes.c_void_p
  35. kernel32.LoadLibraryExW.restype = ctypes.c_void_p
  36. for dll_path in dll_paths:
  37. if sys.version_info >= (3, 8):
  38. os.add_dll_directory(dll_path)
  39. elif has_load_library_attr:
  40. res = kernel32.AddDllDirectory(dll_path)
  41. if res is None:
  42. err = ctypes.WinError(ctypes.get_last_error())
  43. err.strerror += ' Error adding "{}" to the DLL search PATH.'.format(
  44. dll_path
  45. )
  46. raise err
  47. else:
  48. print("WARN: python or OS env have some issue, may load DLL failed!!!")
  49. dlls = glob.glob(os.path.join(lib_path, "*.dll"))
  50. path_patched = False
  51. for dll in dlls:
  52. is_loaded = False
  53. if has_load_library_attr:
  54. res = kernel32.LoadLibraryExW(dll, None, 0x00001100)
  55. last_error = ctypes.get_last_error()
  56. if res is None and last_error != 126:
  57. err = ctypes.WinError(last_error)
  58. err.strerror += ' Error loading "{}" or one of its dependencies.'.format(
  59. dll
  60. )
  61. err.strerror += " \nplease install VC runtime from: "
  62. err.strerror += " \nhttps://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-160"
  63. raise err
  64. elif res is not None:
  65. is_loaded = True
  66. if not is_loaded:
  67. if not path_patched:
  68. os.environ["PATH"] = ";".join(dll_paths + [os.environ["PATH"]])
  69. path_patched = True
  70. res = kernel32.LoadLibraryW(dll)
  71. if res is None:
  72. err = ctypes.WinError(ctypes.get_last_error())
  73. err.strerror += ' Error loading "{}" or one of its dependencies.'.format(
  74. dll
  75. )
  76. err.strerror += " \nplease install VC runtime from: "
  77. err.strerror += " \nhttps://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-160"
  78. raise err
  79. kernel32.SetErrorMode(old_error_mode)
  80. def check_misc():
  81. check_pip_env()
  82. check_windows()