1 # SPDX-License-Identifier: GPL-2.0-or-later
3 # ----------------------------------------------------------
4 # Author: Stephen Leger (s-leger)
6 # ----------------------------------------------------------
12 PYPATH
= sys
.executable
#bpy.app.binary_path_python
21 def _ensure_user_site_package():
25 site_package
= site
.getusersitepackages()
26 if not os
.path
.exists(site_package
):
27 site_package
= bpy
.utils
.user_resource('SCRIPTS', "site_package", create
=True)
28 site
.addsitedir(site_package
)
29 if site_package
not in sys
.path
:
30 sys
.path
.append(site_package
)
33 def _ensure_user_site_package():
37 site_package = site.getusersitepackages()
38 if os.path.exists(site_package):
39 if site_package not in sys.path:
40 sys.path.append(site_package)
42 site_package = bpy.utils.user_resource('SCRIPTS', "site_package", create=True)
43 site.addsitedir(site_package)
45 def _cmd(self
, action
, options
, module
):
46 if options
is not None and "--user" in options
:
47 self
._ensure
_user
_site
_package
()
49 cmd
= [PYPATH
, "-m", "pip", action
]
51 if options
is not None:
52 cmd
.extend(options
.split(" "))
57 def _popen(self
, cmd
):
58 popen
= subprocess
.Popen(cmd
, stdout
=subprocess
.PIPE
, universal_newlines
=True)
59 for stdout_line
in iter(popen
.stdout
.readline
, ""):
67 for line
in self
._popen
(cmd
):
73 if "Successfully" in line
:
86 self
._run
([PYPATH
, "-m", "ensurepip", "--default-pip"])
90 return Pip()._cmd
("install", "--upgrade", "pip")
93 def uninstall(module
, options
=None):
95 :param module: string module name with requirements see:[1]
96 :param options: string command line options see:[2]
97 :return: True on uninstall, False if already removed, raise on Error
98 [1] https://pip.pypa.io/en/stable/reference/pip_install/#id29
99 [2] https://pip.pypa.io/en/stable/reference/pip_install/#id47
101 if options
is None or options
.strip() == "":
104 return Pip()._cmd
("uninstall", options
, module
)
107 def install(module
, options
=None):
109 :param module: string module name with requirements see:[1]
110 :param options: string command line options see:[2]
111 :return: True on install, False if already there, raise on Error
112 [1] https://pip.pypa.io/en/stable/reference/pip_install/#id29
113 [2] https://pip.pypa.io/en/stable/reference/pip_install/#id47
115 if options
is None or options
.strip() == "":
116 # store in user writable directory, use wheel, without deps
117 options
= "--user --only-binary all --no-deps"
118 return Pip()._cmd
("install", options
, module
)
121 def blender_version():
123 :return: blender version tuple
125 return bpy
.app
.version
128 def python_version():
130 :return: python version object
133 # version.major, version.minor, version.micro
134 return sys
.version_info