You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					71 lines
				
				2.4 KiB
			
		
		
			
		
	
	
					71 lines
				
				2.4 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"""Primary application entrypoint.
							 | 
						||
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								import locale
							 | 
						||
| 
								 | 
							
								import logging
							 | 
						||
| 
								 | 
							
								import os
							 | 
						||
| 
								 | 
							
								import sys
							 | 
						||
| 
								 | 
							
								from typing import List, Optional
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from pip._internal.cli.autocompletion import autocomplete
							 | 
						||
| 
								 | 
							
								from pip._internal.cli.main_parser import parse_command
							 | 
						||
| 
								 | 
							
								from pip._internal.commands import create_command
							 | 
						||
| 
								 | 
							
								from pip._internal.exceptions import PipError
							 | 
						||
| 
								 | 
							
								from pip._internal.utils import deprecation
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								logger = logging.getLogger(__name__)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Do not import and use main() directly! Using it directly is actively
							 | 
						||
| 
								 | 
							
								# discouraged by pip's maintainers. The name, location and behavior of
							 | 
						||
| 
								 | 
							
								# this function is subject to change, so calling it directly is not
							 | 
						||
| 
								 | 
							
								# portable across different pip versions.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# In addition, running pip in-process is unsupported and unsafe. This is
							 | 
						||
| 
								 | 
							
								# elaborated in detail at
							 | 
						||
| 
								 | 
							
								# https://pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program.
							 | 
						||
| 
								 | 
							
								# That document also provides suggestions that should work for nearly
							 | 
						||
| 
								 | 
							
								# all users that are considering importing and using main() directly.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# However, we know that certain users will still want to invoke pip
							 | 
						||
| 
								 | 
							
								# in-process. If you understand and accept the implications of using pip
							 | 
						||
| 
								 | 
							
								# in an unsupported manner, the best approach is to use runpy to avoid
							 | 
						||
| 
								 | 
							
								# depending on the exact location of this entry point.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# The following example shows how to use runpy to invoke pip in that
							 | 
						||
| 
								 | 
							
								# case:
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#     sys.argv = ["pip", your, args, here]
							 | 
						||
| 
								 | 
							
								#     runpy.run_module("pip", run_name="__main__")
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Note that this will exit the process after running, unlike a direct
							 | 
						||
| 
								 | 
							
								# call to main. As it is not safe to do any processing after calling
							 | 
						||
| 
								 | 
							
								# main, this should not be an issue in practice.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def main(args: Optional[List[str]] = None) -> int:
							 | 
						||
| 
								 | 
							
								    if args is None:
							 | 
						||
| 
								 | 
							
								        args = sys.argv[1:]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Configure our deprecation warnings to be sent through loggers
							 | 
						||
| 
								 | 
							
								    deprecation.install_warning_logger()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    autocomplete()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    try:
							 | 
						||
| 
								 | 
							
								        cmd_name, cmd_args = parse_command(args)
							 | 
						||
| 
								 | 
							
								    except PipError as exc:
							 | 
						||
| 
								 | 
							
								        sys.stderr.write(f"ERROR: {exc}")
							 | 
						||
| 
								 | 
							
								        sys.stderr.write(os.linesep)
							 | 
						||
| 
								 | 
							
								        sys.exit(1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Needed for locale.getpreferredencoding(False) to work
							 | 
						||
| 
								 | 
							
								    # in pip._internal.utils.encoding.auto_decode
							 | 
						||
| 
								 | 
							
								    try:
							 | 
						||
| 
								 | 
							
								        locale.setlocale(locale.LC_ALL, "")
							 | 
						||
| 
								 | 
							
								    except locale.Error as e:
							 | 
						||
| 
								 | 
							
								        # setlocale can apparently crash if locale are uninitialized
							 | 
						||
| 
								 | 
							
								        logger.debug("Ignoring error %s when setting locale", e)
							 | 
						||
| 
								 | 
							
								    command = create_command(cmd_name, isolated=("--isolated" in cmd_args))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return command.main(cmd_args)
							 |