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 4.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import ctypes
  2. import glob
  3. import os
  4. import platform
  5. import sys
  6. def check_pip_env():
  7. filter_package_name = 'megbrain'
  8. need_package_name = 'megengine'
  9. import pkg_resources
  10. installed_packages = pkg_resources.working_set
  11. installed_packages_list = sorted(["%s" % i.key.lower() for i in installed_packages])
  12. assert (
  13. filter_package_name not in installed_packages_list
  14. ), "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(
  15. filter_package_name, need_package_name, need_package_name
  16. )
  17. assert (
  18. "megenginelite" not in installed_packages_list
  19. ), "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(
  20. need_package_name, need_package_name
  21. )
  22. def check_termux():
  23. if os.getenv("TERMUX_VERSION"):
  24. try:
  25. import cv2
  26. except Exception as exc:
  27. print("Run MegEngine python interface at Android/Termux env")
  28. print("!!!You need build opencv-python manually!!!, by run sh:")
  29. print(
  30. "https://github.com/MegEngine/MegEngine/blob/master/scripts/whl/android/android_opencv_python.sh"
  31. )
  32. raise exc
  33. def check_windows():
  34. if sys.platform == "win32":
  35. lib_path = os.path.join(os.path.dirname(__file__), "core/lib")
  36. dll_paths = list(filter(os.path.exists, [lib_path,]))
  37. assert len(dll_paths) > 0
  38. kernel32 = ctypes.WinDLL("kernel32.dll", use_last_error=True)
  39. has_load_library_attr = hasattr(kernel32, "AddDllDirectory")
  40. old_error_mode = kernel32.SetErrorMode(0x0001)
  41. kernel32.LoadLibraryW.restype = ctypes.c_void_p
  42. if has_load_library_attr:
  43. kernel32.AddDllDirectory.restype = ctypes.c_void_p
  44. kernel32.LoadLibraryExW.restype = ctypes.c_void_p
  45. for dll_path in dll_paths:
  46. if sys.version_info >= (3, 8):
  47. os.add_dll_directory(dll_path)
  48. elif has_load_library_attr:
  49. res = kernel32.AddDllDirectory(dll_path)
  50. if res is None:
  51. err = ctypes.WinError(ctypes.get_last_error())
  52. err.strerror += ' Error adding "{}" to the DLL search PATH.'.format(
  53. dll_path
  54. )
  55. raise err
  56. else:
  57. print("WARN: python or OS env have some issue, may load DLL failed!!!")
  58. dlls = glob.glob(os.path.join(lib_path, "*.dll"))
  59. path_patched = False
  60. for dll in dlls:
  61. is_loaded = False
  62. if has_load_library_attr:
  63. res = kernel32.LoadLibraryExW(dll, None, 0x00001100)
  64. last_error = ctypes.get_last_error()
  65. if res is None and last_error != 126:
  66. err = ctypes.WinError(last_error)
  67. err.strerror += ' Error loading "{}" or one of its dependencies.'.format(
  68. dll
  69. )
  70. err.strerror += " \nplease install VC runtime from: "
  71. err.strerror += " \nhttps://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-160"
  72. raise err
  73. elif res is not None:
  74. is_loaded = True
  75. if not is_loaded:
  76. if not path_patched:
  77. os.environ["PATH"] = ";".join(dll_paths + [os.environ["PATH"]])
  78. path_patched = True
  79. res = kernel32.LoadLibraryW(dll)
  80. if res is None:
  81. err = ctypes.WinError(ctypes.get_last_error())
  82. err.strerror += ' Error loading "{}" or one of its dependencies.'.format(
  83. dll
  84. )
  85. err.strerror += " \nplease install VC runtime from: "
  86. err.strerror += " \nhttps://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-160"
  87. raise err
  88. kernel32.SetErrorMode(old_error_mode)
  89. def check_misc():
  90. check_pip_env()
  91. check_termux()
  92. check_windows()