diff --git a/setup.py b/setup.py index ed1f0109818..b05c1b8779b 100644 --- a/setup.py +++ b/setup.py @@ -71,9 +71,9 @@ def find_version(*file_paths): }, entry_points={ "console_scripts": [ - "pip=pip._internal:main", - "pip%s=pip._internal:main" % sys.version_info[:1], - "pip%s.%s=pip._internal:main" % sys.version_info[:2], + "pip=pip._internal.main:main", + "pip%s=pip._internal.main:main" % sys.version_info[:1], + "pip%s.%s=pip._internal.main:main" % sys.version_info[:2], ], }, diff --git a/src/pip/__main__.py b/src/pip/__main__.py index 0c223f8c187..49b6fdf71ca 100644 --- a/src/pip/__main__.py +++ b/src/pip/__main__.py @@ -13,7 +13,7 @@ path = os.path.dirname(os.path.dirname(__file__)) sys.path.insert(0, path) -from pip._internal import main as _main # isort:skip # noqa +from pip._internal.main import main as _main # isort:skip # noqa if __name__ == '__main__': sys.exit(_main()) diff --git a/src/pip/_internal/__init__.py b/src/pip/_internal/__init__.py index bb5cbff323c..b88a97c46c8 100755 --- a/src/pip/_internal/__init__.py +++ b/src/pip/_internal/__init__.py @@ -1,10 +1,6 @@ #!/usr/bin/env python from __future__ import absolute_import -import locale -import logging -import os -import sys import warnings # We ignore certain warnings from urllib3, since they are not relevant to pip's @@ -15,11 +11,6 @@ ) import pip._internal.utils.inject_securetransport # noqa -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 # Raised when using --trusted-host. warnings.filterwarnings("ignore", category=InsecureRequestWarning) @@ -27,33 +18,3 @@ # Barry Warsaw noted (on 2016-06-17) that this should be done before # importing pip.vcs, which has since moved to pip._internal.vcs. warnings.filterwarnings("ignore", category=DependencyWarning) - -logger = logging.getLogger(__name__) - - -def main(args=None): - 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("ERROR: %s" % 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) diff --git a/src/pip/_internal/main.py b/src/pip/_internal/main.py new file mode 100644 index 00000000000..9b55d0f02de --- /dev/null +++ b/src/pip/_internal/main.py @@ -0,0 +1,44 @@ +"""Primary application entrypoint. +""" +from __future__ import absolute_import + +import locale +import logging +import os +import sys + +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__) + + +def main(args=None): + 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("ERROR: %s" % 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) diff --git a/tests/conftest.py b/tests/conftest.py index 5982ebf9014..134eddd7705 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -10,7 +10,7 @@ import six from setuptools.wheel import Wheel -import pip._internal +from pip._internal.main import main as pip_entry_point from tests.lib import DATA_DIR, SRC_DIR, TestData from tests.lib.path import Path from tests.lib.scripttest import PipTestEnvironment @@ -342,7 +342,7 @@ def pip(self, *args): stdout = io.BytesIO() sys.stdout = stdout try: - returncode = pip._internal.main(list(args)) + returncode = pip_entry_point(list(args)) except SystemExit as e: returncode = e.code or 0 finally: diff --git a/tests/functional/test_completion.py b/tests/functional/test_completion.py index 5491ce22d30..9280b5d6a8a 100644 --- a/tests/functional/test_completion.py +++ b/tests/functional/test_completion.py @@ -78,7 +78,9 @@ def setup_completion(script, words, cword, cwd=None): # expect_error is True because autocomplete exists with 1 status code result = script.run( - 'python', '-c', 'import pip._internal;pip._internal.autocomplete()', + 'python', '-c', + 'from pip._internal.cli.autocompletion import autocomplete;' + 'autocomplete()', expect_error=True, cwd=cwd, ) diff --git a/tests/unit/test_options.py b/tests/unit/test_options.py index 32509209869..c49801d99de 100644 --- a/tests/unit/test_options.py +++ b/tests/unit/test_options.py @@ -4,9 +4,9 @@ import pytest import pip._internal.configuration -from pip._internal import main from pip._internal.commands import create_command from pip._internal.exceptions import PipError +from pip._internal.main import main from tests.lib.options_helpers import AddFakeCommandMixin