cengal.bulk_pip_actions.install.versions.v_0.install
1#!/usr/bin/env python 2# coding=utf-8 3 4# Copyright © 2012-2024 ButenkoMS. All rights reserved. Contacts: <gtalk@butenkoms.space> 5# 6# Licensed under the Apache License, Version 2.0 (the "License"); 7# you may not use this file except in compliance with the License. 8# You may obtain a copy of the License at 9# 10# http://www.apache.org/licenses/LICENSE-2.0 11# 12# Unless required by applicable law or agreed to in writing, software 13# distributed under the License is distributed on an "AS IS" BASIS, 14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15# See the License for the specific language governing permissions and 16# limitations under the License. 17 18# import pip 19# from pip._internal import main as pip_main 20 21from cengal.os.execute import prepare_py_params 22from cengal.cross_version.console_print.universal import cross_print 23 24import platform 25import sys 26import os.path 27from contextlib import contextmanager 28 29""" 30Module Docstring 31Docstrings: http://www.python.org/dev/peps/pep-0257/ 32""" 33 34__author__ = "ButenkoMS <gtalk@butenkoms.space>" 35__copyright__ = "Copyright © 2012-2024 ButenkoMS. All rights reserved. Contacts: <gtalk@butenkoms.space>" 36__credits__ = ["ButenkoMS <gtalk@butenkoms.space>", ] 37__license__ = "Apache License, Version 2.0" 38__version__ = "4.4.1" 39__maintainer__ = "ButenkoMS <gtalk@butenkoms.space>" 40__email__ = "gtalk@butenkoms.space" 41# __status__ = "Prototype" 42__status__ = "Development" 43# __status__ = "Production" 44 45 46PLATFORM_NAME = platform.python_implementation() # can be 'PyPy', 'CPython', etc. 47PYTHON_VERSION = platform.python_version_tuple() # tuple() of str(); for example: ('3', '5', '1') 48PYTHON_VERSION_INT = sys.version_info # sys.version_info == (major=3, minor=2, micro=5, releaselevel='final', serial=0) 49# Usage: sys.version_info >= (3, 7) 50 51 52# On Python < 3.4 you should install enum backport module before you will be able to use it. So: 53FROM_PYPI = 0 54FROM_ZIP = 1 55FROM_FOLDER_WITH_ZIP_FILES = 2 56FROM_EXTERNAL_GIT = 3 57 58 59_FILTERING_TYPE__OFF = 0 60_FILTERING_TYPE__INCLUDING = 1 61_FILTERING_TYPE__EXCLUDING = 2 62 63 64# Do not import this function from THIS module! 65@contextmanager 66def _change_current_dir(new_current_dir): 67 cur_dir = os.getcwd() 68 os.chdir(new_current_dir) 69 try: 70 yield 71 except: 72 raise 73 finally: 74 os.chdir(cur_dir) 75 76 77# Do not import this function from THIS module! 78def _filtered_file_list_traversal(root_dir, filtering_type, extentions_set=None, remove_empty_items=False): 79 """ 80 :param root_dir: str(); r'C:\dir\path' 81 :param filtering_type: FilteringType() 82 :param extentions_set: set(); {'.upk', '.txt'} 83 :return: list() of tuple(); list of (dirpath, dirnames, new_filenames) 84 """ 85 86 if (_FILTERING_TYPE__OFF != filtering_type) and (extentions_set is None): 87 raise Exception('extentions_set can\'t be None with this filtering type') 88 89 result_list = list() 90 for raw_result in os.walk(root_dir): 91 dirpath = raw_result[0] 92 dirnames = raw_result[1] 93 filenames = raw_result[2] 94 95 new_filenames = list() 96 for filename in filenames: 97 if _FILTERING_TYPE__OFF == filtering_type: 98 new_filenames.append(filename) 99 elif _FILTERING_TYPE__INCLUDING == filtering_type: 100 extention = os.path.splitext(filename)[1] 101 if extention in extentions_set: 102 new_filenames.append(filename) 103 elif _FILTERING_TYPE__EXCLUDING == filtering_type: 104 extention = os.path.splitext(filename)[1] 105 if extention not in extentions_set: 106 new_filenames.append(filename) 107 if remove_empty_items: 108 if len(new_filenames) > 0: 109 result = (dirpath, dirnames, new_filenames) 110 result_list.append(result) 111 else: 112 result = (dirpath, dirnames, new_filenames) 113 result_list.append(result) 114 115 return result_list 116 117 118# def pip_install(name_or_path): 119# command_line = None 120# pip_name = None 121# if 'nt' == os.name: 122# path_to_interpreter = sys.executable 123# interpreter_root_dir_name = os.path.dirname(path_to_interpreter) 124# path_to_pip = os.path.join(interpreter_root_dir_name, 'Scripts', 'pip.exe') 125# pip_name_template = '"{}"' 126# pip_name = pip_name_template.format(path_to_pip) 127# else: 128# if '2' == PYTHON_VERSION[0]: 129# pip_name = 'pip' 130# elif '3' == PYTHON_VERSION[0]: 131# pip_name = 'pip3' 132# command_line_template = '{pip_name} install --upgrade {package_name_or_path}' 133# command_line = command_line_template.format(pip_name=pip_name, package_name_or_path=name_or_path) 134# os.system(command_line) 135 136 137def pip_install(name_or_path): 138 os.system(prepare_py_params(['-m', 'pip', 'install', '--upgrade', name_or_path])) 139 140 141def install(name_or_path, type_of_installation): 142 """ 143 Will exit(1) on error (done by pip_main() itself)! 144 :param name_or_path: 'tornado', './python-lzf-master-python3.zip', './InstallSourcess/Python3/', etc. 145 :param type_of_installation: {FROM_PYPI, FROM_ZIP, FROM_FOLDER_WITH_ZIP_FILES} 146 :return: 147 """ 148 if FROM_PYPI == type_of_installation: 149 # pip_main(['install', name_or_path]) 150 pip_install(name_or_path) 151 cross_print('') 152 elif FROM_ZIP == type_of_installation: 153 # pip_main(['install', name_or_path]) 154 pip_install(name_or_path) 155 cross_print('') 156 elif FROM_FOLDER_WITH_ZIP_FILES == type_of_installation: 157 interested_extensions = {'.zip'} 158 result_list = _filtered_file_list_traversal(name_or_path, _FILTERING_TYPE__INCLUDING, interested_extensions) 159 for result in result_list: 160 for filename in result[2]: 161 # I'm not sure now, but I think I remember that there was some troubles when you trying to install 162 # some zipped modules with full path under PyPy. So: 163 relative_file_name = os.path.join('.', filename) 164 with _change_current_dir(result[0]): 165 # pip_main(['install', relative_file_name]) 166 pip_install(relative_file_name) 167 cross_print('')
PLATFORM_NAME =
'CPython'
PYTHON_VERSION =
('3', '8', '10')
PYTHON_VERSION_INT =
sys.version_info(major=3, minor=8, micro=10, releaselevel='final', serial=0)
FROM_PYPI =
0
FROM_ZIP =
1
FROM_FOLDER_WITH_ZIP_FILES =
2
FROM_EXTERNAL_GIT =
3
def
pip_install(name_or_path):
def
install(name_or_path, type_of_installation):
142def install(name_or_path, type_of_installation): 143 """ 144 Will exit(1) on error (done by pip_main() itself)! 145 :param name_or_path: 'tornado', './python-lzf-master-python3.zip', './InstallSourcess/Python3/', etc. 146 :param type_of_installation: {FROM_PYPI, FROM_ZIP, FROM_FOLDER_WITH_ZIP_FILES} 147 :return: 148 """ 149 if FROM_PYPI == type_of_installation: 150 # pip_main(['install', name_or_path]) 151 pip_install(name_or_path) 152 cross_print('') 153 elif FROM_ZIP == type_of_installation: 154 # pip_main(['install', name_or_path]) 155 pip_install(name_or_path) 156 cross_print('') 157 elif FROM_FOLDER_WITH_ZIP_FILES == type_of_installation: 158 interested_extensions = {'.zip'} 159 result_list = _filtered_file_list_traversal(name_or_path, _FILTERING_TYPE__INCLUDING, interested_extensions) 160 for result in result_list: 161 for filename in result[2]: 162 # I'm not sure now, but I think I remember that there was some troubles when you trying to install 163 # some zipped modules with full path under PyPy. So: 164 relative_file_name = os.path.join('.', filename) 165 with _change_current_dir(result[0]): 166 # pip_main(['install', relative_file_name]) 167 pip_install(relative_file_name) 168 cross_print('')
Will exit(1) on error (done by pip_main() itself)! :param name_or_path: 'tornado', './python-lzf-master-python3.zip', './InstallSourcess/Python3/', etc. :param type_of_installation: {FROM_PYPI, FROM_ZIP, FROM_FOLDER_WITH_ZIP_FILES} :return: