mirror of https://github.com/pypa/pip
Merge branch 'master' into release/20.2.4
This commit is contained in:
commit
d0051aafb0
|
@ -43,7 +43,7 @@ steps:
|
||||||
# https://bugs.python.org/issue18199
|
# https://bugs.python.org/issue18199
|
||||||
$env:TEMP = "R:\Temp"
|
$env:TEMP = "R:\Temp"
|
||||||
|
|
||||||
tox -e py -- -m integration -n auto --duration=5 --junit-xml=junit/integration-test.xml
|
tox -e py -- -m integration -n auto --durations=5 --junit-xml=junit/integration-test.xml
|
||||||
displayName: Tox run integration tests
|
displayName: Tox run integration tests
|
||||||
|
|
||||||
- task: PublishTestResults@2
|
- task: PublishTestResults@2
|
||||||
|
|
|
@ -11,10 +11,10 @@ steps:
|
||||||
displayName: Tox run unit tests
|
displayName: Tox run unit tests
|
||||||
|
|
||||||
# Run integration tests in two groups so we will fail faster if there is a failure in the first group
|
# Run integration tests in two groups so we will fail faster if there is a failure in the first group
|
||||||
- script: tox -e py -- -m integration -n auto --duration=5 -k "not test_install" --junit-xml=junit/integration-test-group0.xml
|
- script: tox -e py -- -m integration -n auto --durations=5 -k "not test_install" --junit-xml=junit/integration-test-group0.xml
|
||||||
displayName: Tox run Group 0 integration tests
|
displayName: Tox run Group 0 integration tests
|
||||||
|
|
||||||
- script: tox -e py -- -m integration -n auto --duration=5 -k "test_install" --junit-xml=junit/integration-test-group1.xml
|
- script: tox -e py -- -m integration -n auto --durations=5 -k "test_install" --junit-xml=junit/integration-test-group1.xml
|
||||||
displayName: Tox run Group 1 integration tests
|
displayName: Tox run Group 1 integration tests
|
||||||
|
|
||||||
- task: PublishTestResults@2
|
- task: PublishTestResults@2
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Ref: https://help.github.com/en/github/building-a-strong-community/configuring-issue-templates-for-your-repository#configuring-the-template-chooser
|
# Ref: https://help.github.com/en/github/building-a-strong-community/configuring-issue-templates-for-your-repository#configuring-the-template-chooser
|
||||||
blank_issues_enabled: true # default
|
blank_issues_enabled: true # default
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: 🤷💻🤦 Discourse
|
- name: 💬 Discourse
|
||||||
url: https://discuss.python.org/c/packaging
|
url: https://discuss.python.org/c/packaging
|
||||||
about: |
|
about: |
|
||||||
Please ask typical Q&A here: general ideas for Python packaging,
|
Please ask typical Q&A here: general ideas for Python packaging,
|
||||||
|
@ -9,6 +9,3 @@ contact_links:
|
||||||
- name: '💬 IRC: #pypa @ Freenode'
|
- name: '💬 IRC: #pypa @ Freenode'
|
||||||
url: https://webchat.freenode.net/#pypa
|
url: https://webchat.freenode.net/#pypa
|
||||||
about: Chat with devs
|
about: Chat with devs
|
||||||
- name: 📝 PyPA Code of Conduct
|
|
||||||
url: https://www.pypa.io/en/latest/code-of-conduct/
|
|
||||||
about: ❤ Be nice to other members of the community. ☮ Behave.
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ exclude: 'src/pip/_vendor/'
|
||||||
|
|
||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
rev: v2.5.0
|
rev: v3.2.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: check-builtin-literals
|
- id: check-builtin-literals
|
||||||
- id: check-added-large-files
|
- id: check-added-large-files
|
||||||
|
@ -16,8 +16,44 @@ repos:
|
||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
exclude: .patch
|
exclude: .patch
|
||||||
|
|
||||||
|
- repo: https://github.com/psf/black
|
||||||
|
rev: 20.8b1
|
||||||
|
hooks:
|
||||||
|
- id: black
|
||||||
|
exclude: |
|
||||||
|
(?x)
|
||||||
|
^docs/|
|
||||||
|
^src/pip/_internal/cli|
|
||||||
|
^src/pip/_internal/commands|
|
||||||
|
^src/pip/_internal/distributions|
|
||||||
|
^src/pip/_internal/index|
|
||||||
|
^src/pip/_internal/models|
|
||||||
|
^src/pip/_internal/network|
|
||||||
|
^src/pip/_internal/operations|
|
||||||
|
^src/pip/_internal/req|
|
||||||
|
^src/pip/_internal/resolution|
|
||||||
|
^src/pip/_internal/utils|
|
||||||
|
^src/pip/_internal/vcs|
|
||||||
|
^src/pip/_internal/\w+\.py$|
|
||||||
|
^src/pip/__main__.py$|
|
||||||
|
^tools/|
|
||||||
|
# Tests
|
||||||
|
^tests/conftest.py|
|
||||||
|
^tests/yaml|
|
||||||
|
^tests/lib|
|
||||||
|
^tests/data|
|
||||||
|
^tests/unit|
|
||||||
|
^tests/functional/(?!test_install)|
|
||||||
|
^tests/functional/test_install|
|
||||||
|
# Files in the root of the repository
|
||||||
|
^setup.py|
|
||||||
|
^noxfile.py|
|
||||||
|
# A blank ignore, to avoid merge conflicts later.
|
||||||
|
^$
|
||||||
|
|
||||||
|
|
||||||
- repo: https://gitlab.com/pycqa/flake8
|
- repo: https://gitlab.com/pycqa/flake8
|
||||||
rev: 3.8.1
|
rev: 3.8.3
|
||||||
hooks:
|
hooks:
|
||||||
- id: flake8
|
- id: flake8
|
||||||
additional_dependencies: [
|
additional_dependencies: [
|
||||||
|
@ -27,7 +63,7 @@ repos:
|
||||||
exclude: tests/data
|
exclude: tests/data
|
||||||
|
|
||||||
- repo: https://github.com/timothycrosley/isort
|
- repo: https://github.com/timothycrosley/isort
|
||||||
rev: 4.3.21
|
rev: 5.5.3
|
||||||
hooks:
|
hooks:
|
||||||
- id: isort
|
- id: isort
|
||||||
files: \.py$
|
files: \.py$
|
||||||
|
@ -44,18 +80,25 @@ repos:
|
||||||
args: ["--pretty", "-2"]
|
args: ["--pretty", "-2"]
|
||||||
|
|
||||||
- repo: https://github.com/pre-commit/pygrep-hooks
|
- repo: https://github.com/pre-commit/pygrep-hooks
|
||||||
rev: v1.5.1
|
rev: v1.6.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: python-no-log-warn
|
- id: python-no-log-warn
|
||||||
- id: python-no-eval
|
- id: python-no-eval
|
||||||
- id: rst-backticks
|
- id: rst-backticks
|
||||||
# Validate existing ReST files and NEWS fragments.
|
files: .*\.rst$
|
||||||
files: .*\.rst$|^news/.*
|
|
||||||
types: [file]
|
types: [file]
|
||||||
# The errors flagged in NEWS.rst are old.
|
exclude: NEWS.rst # The errors flagged in NEWS.rst are old.
|
||||||
exclude: NEWS.rst
|
|
||||||
|
- repo: local
|
||||||
|
hooks:
|
||||||
|
- id: news-fragment-filenames
|
||||||
|
name: NEWS fragment
|
||||||
|
language: fail
|
||||||
|
entry: NEWS fragment files must be named *.(process|removal|feature|bugfix|vendor|doc|trivial).rst
|
||||||
|
exclude: ^news/(.gitignore|.*\.(process|removal|feature|bugfix|vendor|doc|trivial).rst)
|
||||||
|
files: ^news/
|
||||||
|
|
||||||
- repo: https://github.com/mgedmin/check-manifest
|
- repo: https://github.com/mgedmin/check-manifest
|
||||||
rev: '0.42'
|
rev: '0.43'
|
||||||
hooks:
|
hooks:
|
||||||
- id: check-manifest
|
- id: check-manifest
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file)
|
Copyright (c) 2008-2020 The pip developers (see AUTHORS.txt file)
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
a copy of this software and associated documentation files (the
|
a copy of this software and associated documentation files (the
|
||||||
|
|
|
@ -22,7 +22,7 @@ exclude noxfile.py
|
||||||
|
|
||||||
recursive-include src/pip/_vendor *.pem
|
recursive-include src/pip/_vendor *.pem
|
||||||
recursive-include src/pip/_vendor py.typed
|
recursive-include src/pip/_vendor py.typed
|
||||||
recursive-include docs Makefile *.rst *.py *.bat
|
recursive-include docs *.css *.rst *.py
|
||||||
|
|
||||||
exclude src/pip/_vendor/six
|
exclude src/pip/_vendor/six
|
||||||
exclude src/pip/_vendor/six/moves
|
exclude src/pip/_vendor/six/moves
|
||||||
|
|
|
@ -38,7 +38,7 @@ Code of Conduct
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
Everyone interacting in the pip project's codebases, issue trackers, chat
|
Everyone interacting in the pip project's codebases, issue trackers, chat
|
||||||
rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.
|
rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.
|
||||||
|
|
||||||
.. _package installer: https://packaging.python.org/guides/tool-recommendations/
|
.. _package installer: https://packaging.python.org/guides/tool-recommendations/
|
||||||
.. _Python Package Index: https://pypi.org
|
.. _Python Package Index: https://pypi.org
|
||||||
|
@ -54,4 +54,4 @@ rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.
|
||||||
.. _Development mailing list: https://mail.python.org/mailman3/lists/distutils-sig.python.org/
|
.. _Development mailing list: https://mail.python.org/mailman3/lists/distutils-sig.python.org/
|
||||||
.. _User IRC: https://webchat.freenode.net/?channels=%23pypa
|
.. _User IRC: https://webchat.freenode.net/?channels=%23pypa
|
||||||
.. _Development IRC: https://webchat.freenode.net/?channels=%23pypa-dev
|
.. _Development IRC: https://webchat.freenode.net/?channels=%23pypa-dev
|
||||||
.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
|
.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
|
||||||
|
|
|
@ -0,0 +1,165 @@
|
||||||
|
"""A sphinx extension for collecting per doc feedback."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from itertools import chain
|
||||||
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from typing import Dict, List, Union
|
||||||
|
|
||||||
|
from sphinx.application import Sphinx
|
||||||
|
|
||||||
|
|
||||||
|
DEFAULT_DOC_LINES_THRESHOLD = 250
|
||||||
|
RST_INDENT = 4
|
||||||
|
EMAIL_INDENT = 6
|
||||||
|
|
||||||
|
|
||||||
|
def _modify_rst_document_source_on_read(
|
||||||
|
app: Sphinx,
|
||||||
|
docname: str,
|
||||||
|
source: List[str],
|
||||||
|
) -> None:
|
||||||
|
"""Add info block to top and bottom of each document source.
|
||||||
|
|
||||||
|
This function modifies RST source in-place by adding an admonition
|
||||||
|
block at the top and the bottom of each document right after it's
|
||||||
|
been read from disk preserving :orphan: at top, if present.
|
||||||
|
"""
|
||||||
|
admonition_type = app.config.docs_feedback_admonition_type
|
||||||
|
big_doc_lines = app.config.docs_feedback_big_doc_lines
|
||||||
|
escaped_email = app.config.docs_feedback_email.replace(' ', r'\ ')
|
||||||
|
excluded_documents = set(app.config.docs_feedback_excluded_documents)
|
||||||
|
questions_list = app.config.docs_feedback_questions_list
|
||||||
|
|
||||||
|
valid_admonitions = {
|
||||||
|
'attention', 'caution', 'danger', 'error', 'hint',
|
||||||
|
'important', 'note', 'tip', 'warning', 'admonition',
|
||||||
|
}
|
||||||
|
|
||||||
|
if admonition_type not in valid_admonitions:
|
||||||
|
raise ValueError(
|
||||||
|
'Expected `docs_feedback_admonition_type` to be one of '
|
||||||
|
f'{valid_admonitions} but got {admonition_type}.'
|
||||||
|
)
|
||||||
|
|
||||||
|
if not questions_list:
|
||||||
|
raise ValueError(
|
||||||
|
'Expected `docs_feedback_questions_list` to list questions '
|
||||||
|
'but got none.'
|
||||||
|
)
|
||||||
|
|
||||||
|
if docname in excluded_documents:
|
||||||
|
# NOTE: Completely ignore any document
|
||||||
|
# NOTE: listed in 'docs_feedback_excluded_documents'.
|
||||||
|
return
|
||||||
|
|
||||||
|
is_doc_big = source[0].count('\n') >= big_doc_lines
|
||||||
|
|
||||||
|
questions_list_rst = '\n'.join(
|
||||||
|
f'{" " * RST_INDENT}{number!s}. {question}'
|
||||||
|
for number, question in enumerate(questions_list, 1)
|
||||||
|
)
|
||||||
|
questions_list_urlencoded = (
|
||||||
|
'\n'.join(
|
||||||
|
f'\n{" " * RST_INDENT}{number!s}. {question} '
|
||||||
|
for number, question in enumerate(
|
||||||
|
chain(
|
||||||
|
(f'Document: {docname}. Page URL: https://', ),
|
||||||
|
questions_list,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
).
|
||||||
|
rstrip('\r\n\t ').
|
||||||
|
replace('\r', '%0D').
|
||||||
|
replace('\n', '%0A').
|
||||||
|
replace(' ', '%20')
|
||||||
|
)
|
||||||
|
|
||||||
|
admonition_msg = rf"""
|
||||||
|
**Did this article help?**
|
||||||
|
|
||||||
|
We are currently doing research to improve pip's documentation
|
||||||
|
and would love your feedback.
|
||||||
|
Please `email us`_ and let us know{{let_us_know_ending}}
|
||||||
|
|
||||||
|
{{questions_list_rst}}
|
||||||
|
|
||||||
|
.. _email us:
|
||||||
|
mailto:{escaped_email}\
|
||||||
|
?subject=[Doc:\ {docname}]\ Pip\ docs\ feedback\ \
|
||||||
|
(URL\:\ https\://)\
|
||||||
|
&body={questions_list_urlencoded}
|
||||||
|
"""
|
||||||
|
let_us_know_ending = ':'
|
||||||
|
|
||||||
|
info_block_bottom = (
|
||||||
|
f'.. {admonition_type}::\n\t\t{admonition_msg.format_map(locals())}\n'
|
||||||
|
)
|
||||||
|
|
||||||
|
questions_list_rst = ''
|
||||||
|
let_us_know_ending = (
|
||||||
|
' why you came to this page and what on it helped '
|
||||||
|
'you and what did not. '
|
||||||
|
'(:issue:`Read more about this research <8517>`)'
|
||||||
|
)
|
||||||
|
info_block_top = '' if is_doc_big else (
|
||||||
|
f'.. {admonition_type}::\n\t\t{admonition_msg.format_map(locals())}\n'
|
||||||
|
)
|
||||||
|
|
||||||
|
orphan_mark = ':orphan:'
|
||||||
|
is_orphan = orphan_mark in source[0]
|
||||||
|
if is_orphan:
|
||||||
|
source[0].replace(orphan_mark, '')
|
||||||
|
else:
|
||||||
|
orphan_mark = ''
|
||||||
|
|
||||||
|
source[0] = '\n\n'.join((
|
||||||
|
orphan_mark, info_block_top, source[0], info_block_bottom,
|
||||||
|
))
|
||||||
|
|
||||||
|
|
||||||
|
def setup(app: Sphinx) -> Dict[str, Union[bool, str]]:
|
||||||
|
"""Initialize the Sphinx extension.
|
||||||
|
|
||||||
|
This function adds a callback for modifying the document sources
|
||||||
|
in-place on read.
|
||||||
|
|
||||||
|
It also declares the extension settings changable via :file:`conf.py`.
|
||||||
|
"""
|
||||||
|
rebuild_trigger = 'html' # rebuild full html on settings change
|
||||||
|
app.add_config_value(
|
||||||
|
'docs_feedback_admonition_type',
|
||||||
|
default='important',
|
||||||
|
rebuild=rebuild_trigger,
|
||||||
|
)
|
||||||
|
app.add_config_value(
|
||||||
|
'docs_feedback_big_doc_lines',
|
||||||
|
default=DEFAULT_DOC_LINES_THRESHOLD,
|
||||||
|
rebuild=rebuild_trigger,
|
||||||
|
)
|
||||||
|
app.add_config_value(
|
||||||
|
'docs_feedback_email',
|
||||||
|
default='Docs UX Team <docs-feedback+ux/pip.pypa.io@pypa.io>',
|
||||||
|
rebuild=rebuild_trigger,
|
||||||
|
)
|
||||||
|
app.add_config_value(
|
||||||
|
'docs_feedback_excluded_documents',
|
||||||
|
default=set(),
|
||||||
|
rebuild=rebuild_trigger,
|
||||||
|
)
|
||||||
|
app.add_config_value(
|
||||||
|
'docs_feedback_questions_list',
|
||||||
|
default=(),
|
||||||
|
rebuild=rebuild_trigger,
|
||||||
|
)
|
||||||
|
|
||||||
|
app.add_css_file('important-admonition.css')
|
||||||
|
app.connect('source-read', _modify_rst_document_source_on_read)
|
||||||
|
|
||||||
|
return {
|
||||||
|
'parallel_read_safe': True,
|
||||||
|
'parallel_write_safe': True,
|
||||||
|
'version': 'builtin',
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
.admonition.important {
|
||||||
|
background-color: rgb(219, 250, 244);
|
||||||
|
border: 1px solid rgb(26, 188, 156);
|
||||||
|
}
|
||||||
|
|
||||||
|
.admonition.important>.admonition-title {
|
||||||
|
color: rgb(26, 188, 156);
|
||||||
|
}
|
|
@ -30,7 +30,16 @@ sys.path.insert(0, docs_dir)
|
||||||
# Add any Sphinx extension module names here, as strings. They can be
|
# Add any Sphinx extension module names here, as strings. They can be
|
||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||||
# extensions = ['sphinx.ext.autodoc']
|
# extensions = ['sphinx.ext.autodoc']
|
||||||
extensions = ['sphinx.ext.extlinks', 'pip_sphinxext', 'sphinx.ext.intersphinx']
|
extensions = [
|
||||||
|
# native:
|
||||||
|
'sphinx.ext.extlinks',
|
||||||
|
'sphinx.ext.intersphinx',
|
||||||
|
# third-party:
|
||||||
|
'sphinx_tabs.tabs',
|
||||||
|
# in-tree:
|
||||||
|
'docs_feedback_sphinxext',
|
||||||
|
'pip_sphinxext',
|
||||||
|
]
|
||||||
|
|
||||||
# intersphinx
|
# intersphinx
|
||||||
intersphinx_cache_limit = 0
|
intersphinx_cache_limit = 0
|
||||||
|
@ -130,6 +139,9 @@ extlinks = {
|
||||||
'pypi': ('https://pypi.org/project/%s/', ''),
|
'pypi': ('https://pypi.org/project/%s/', ''),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Turn off sphinx build warnings because of sphinx tabs during man pages build
|
||||||
|
sphinx_tabs_nowarn = True
|
||||||
|
|
||||||
# -- Options for HTML output --------------------------------------------------
|
# -- Options for HTML output --------------------------------------------------
|
||||||
|
|
||||||
# The theme to use for HTML and HTML Help pages. Major themes that come with
|
# The theme to use for HTML and HTML Help pages. Major themes that come with
|
||||||
|
@ -143,7 +155,9 @@ html_theme_options = {
|
||||||
'collapsiblesidebar': True,
|
'collapsiblesidebar': True,
|
||||||
'externalrefs': True,
|
'externalrefs': True,
|
||||||
'navigation_depth': 3,
|
'navigation_depth': 3,
|
||||||
'issues_url': 'https://github.com/pypa/pip/issues'
|
'issues_url': 'https://github.com/pypa/pip/issues',
|
||||||
|
'codebgcolor': '#eeffcc',
|
||||||
|
'codetextcolor': '#333333',
|
||||||
}
|
}
|
||||||
|
|
||||||
# Add any paths that contain custom themes here, relative to this directory.
|
# Add any paths that contain custom themes here, relative to this directory.
|
||||||
|
@ -167,7 +181,7 @@ html_theme_options = {
|
||||||
# Add any paths that contain custom static files (such as style sheets) here,
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
# relative to this directory. They are copied after the builtin static files,
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
html_static_path = []
|
html_static_path = ['_static']
|
||||||
|
|
||||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||||
# using the given strftime format.
|
# using the given strftime format.
|
||||||
|
@ -298,3 +312,19 @@ for fname in raw_subcommands:
|
||||||
)
|
)
|
||||||
|
|
||||||
man_pages.append((fname_base, outname, description, u'pip developers', 1))
|
man_pages.append((fname_base, outname, description, u'pip developers', 1))
|
||||||
|
|
||||||
|
# -- Options for docs_feedback_sphinxext --------------------------------------
|
||||||
|
|
||||||
|
# NOTE: Must be one of 'attention', 'caution', 'danger', 'error', 'hint',
|
||||||
|
# NOTE: 'important', 'note', 'tip', 'warning' or 'admonition'.
|
||||||
|
docs_feedback_admonition_type = 'important'
|
||||||
|
docs_feedback_big_doc_lines = 50 # bigger docs will have a banner on top
|
||||||
|
docs_feedback_email = 'Docs UX Team <docs-feedback+ux/pip.pypa.io@pypa.io>'
|
||||||
|
docs_feedback_excluded_documents = { # these won't have any banners
|
||||||
|
'news',
|
||||||
|
}
|
||||||
|
docs_feedback_questions_list = (
|
||||||
|
'What problem were you trying to solve when you came to this page?',
|
||||||
|
'What content was useful?',
|
||||||
|
'What content was not useful?',
|
||||||
|
)
|
||||||
|
|
|
@ -109,6 +109,7 @@ manipulated. In addition to the methods discussed in the previous section,
|
||||||
the methods used would be:
|
the methods used would be:
|
||||||
|
|
||||||
.. py:class:: Configuration
|
.. py:class:: Configuration
|
||||||
|
:noindex:
|
||||||
|
|
||||||
.. py:method:: get_file_to_edit()
|
.. py:method:: get_file_to_edit()
|
||||||
|
|
||||||
|
|
|
@ -70,15 +70,17 @@ such, but it is preferred to have a dedicated issue (for example, in case the
|
||||||
PR ends up rejected due to code quality reasons).
|
PR ends up rejected due to code quality reasons).
|
||||||
|
|
||||||
Once you have an issue or pull request, you take the number and you create a
|
Once you have an issue or pull request, you take the number and you create a
|
||||||
file inside of the ``news/`` directory named after that issue number with an
|
file inside of the ``news/`` directory, named after that issue number with a
|
||||||
extension of ``removal``, ``feature``, ``bugfix``, or ``doc``. Thus if your
|
"type" of ``removal``, ``feature``, ``bugfix``, or ``doc`` associated with it.
|
||||||
issue or PR number is ``1234`` and this change is fixing a bug, then you would
|
|
||||||
create a file ``news/1234.bugfix``. PRs can span multiple categories by creating
|
If your issue or PR number is ``1234`` and this change is fixing a bug,
|
||||||
multiple files (for instance, if you added a feature and deprecated/removed the
|
then you would create a file ``news/1234.bugfix.rst``. PRs can span multiple
|
||||||
old feature at the same time, you would create ``news/NNNN.feature`` and
|
categories by creating multiple files (for instance, if you added a feature and
|
||||||
``news/NNNN.removal``). Likewise if a PR touches multiple issues/PRs you may
|
deprecated/removed the old feature at the same time, you would create
|
||||||
create a file for each of them with the exact same contents and Towncrier will
|
``news/NNNN.feature.rst`` and ``news/NNNN.removal.rst``).
|
||||||
deduplicate them.
|
|
||||||
|
If a PR touches multiple issues/PRs, you may create a file for each of them
|
||||||
|
with the exact same contents and Towncrier will deduplicate them.
|
||||||
|
|
||||||
Contents of a NEWS entry
|
Contents of a NEWS entry
|
||||||
------------------------
|
------------------------
|
||||||
|
|
|
@ -38,13 +38,25 @@ To run the pip executable from your source tree during development, install pip
|
||||||
locally using editable installation (inside a virtualenv).
|
locally using editable installation (inside a virtualenv).
|
||||||
You can then invoke your local source tree pip normally.
|
You can then invoke your local source tree pip normally.
|
||||||
|
|
||||||
.. code-block:: console
|
.. tabs::
|
||||||
|
|
||||||
$ virtualenv venv # You can also use "python -m venv venv" from python3.3+
|
.. group-tab:: Unix/macOS
|
||||||
$ source venv/bin/activate
|
|
||||||
$ python -m pip install -e .
|
|
||||||
$ python -m pip --version
|
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
virtualenv venv # You can also use "python -m venv venv" from python3.3+
|
||||||
|
source venv/bin/activate
|
||||||
|
python -m pip install -e .
|
||||||
|
python -m pip --version
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
virtualenv venv # You can also use "py -m venv venv" from python3.3+
|
||||||
|
venv\Scripts\activate
|
||||||
|
py -m pip install -e .
|
||||||
|
py -m pip --version
|
||||||
|
|
||||||
Running Tests
|
Running Tests
|
||||||
=============
|
=============
|
||||||
|
|
|
@ -36,7 +36,7 @@ Code of Conduct
|
||||||
===============
|
===============
|
||||||
|
|
||||||
Everyone interacting in the pip project's codebases, issue trackers, chat
|
Everyone interacting in the pip project's codebases, issue trackers, chat
|
||||||
rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.
|
rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.
|
||||||
|
|
||||||
.. _package installer: https://packaging.python.org/guides/tool-recommendations/
|
.. _package installer: https://packaging.python.org/guides/tool-recommendations/
|
||||||
.. _Python Package Index: https://pypi.org
|
.. _Python Package Index: https://pypi.org
|
||||||
|
@ -51,4 +51,4 @@ rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.
|
||||||
.. _Development mailing list: https://mail.python.org/mailman3/lists/distutils-sig.python.org/
|
.. _Development mailing list: https://mail.python.org/mailman3/lists/distutils-sig.python.org/
|
||||||
.. _User IRC: https://webchat.freenode.net/?channels=%23pypa
|
.. _User IRC: https://webchat.freenode.net/?channels=%23pypa
|
||||||
.. _Development IRC: https://webchat.freenode.net/?channels=%23pypa-dev
|
.. _Development IRC: https://webchat.freenode.net/?channels=%23pypa-dev
|
||||||
.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
|
.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
|
||||||
|
|
|
@ -26,10 +26,22 @@ this link: `get-pip.py
|
||||||
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
|
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
|
||||||
|
|
||||||
Then run the following command in the folder where you
|
Then run the following command in the folder where you
|
||||||
have downloaded ``get-pip.py``::
|
have downloaded ``get-pip.py``:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
python get-pip.py
|
python get-pip.py
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py get-pip.py
|
||||||
|
|
||||||
|
|
||||||
.. warning::
|
.. warning::
|
||||||
|
|
||||||
|
@ -67,23 +79,70 @@ get-pip.py options
|
||||||
install Options>` and the :ref:`general options <General Options>`. Below are
|
install Options>` and the :ref:`general options <General Options>`. Below are
|
||||||
some examples:
|
some examples:
|
||||||
|
|
||||||
Install from local copies of pip and setuptools::
|
Install from local copies of pip and setuptools:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
python get-pip.py --no-index --find-links=/local/copies
|
python get-pip.py --no-index --find-links=/local/copies
|
||||||
|
|
||||||
Install to the user site [3]_::
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py get-pip.py --no-index --find-links=/local/copies
|
||||||
|
|
||||||
|
Install to the user site [3]_:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
python get-pip.py --user
|
python get-pip.py --user
|
||||||
|
|
||||||
Install behind a proxy::
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py get-pip.py --user
|
||||||
|
|
||||||
|
Install behind a proxy:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
python get-pip.py --proxy="http://[user:passwd@]proxy.server:port"
|
python get-pip.py --proxy="http://[user:passwd@]proxy.server:port"
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py get-pip.py --proxy="http://[user:passwd@]proxy.server:port"
|
||||||
|
|
||||||
``get-pip.py`` can also be used to install a specified combination of ``pip``,
|
``get-pip.py`` can also be used to install a specified combination of ``pip``,
|
||||||
``setuptools``, and ``wheel`` using the same requirements syntax as pip::
|
``setuptools``, and ``wheel`` using the same requirements syntax as pip:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
python get-pip.py pip==9.0.2 wheel==0.30.0 setuptools==28.8.0
|
python get-pip.py pip==9.0.2 wheel==0.30.0 setuptools==28.8.0
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py get-pip.py pip==9.0.2 wheel==0.30.0 setuptools==28.8.0
|
||||||
|
|
||||||
Using Linux Package Managers
|
Using Linux Package Managers
|
||||||
============================
|
============================
|
||||||
|
@ -97,15 +156,20 @@ the `Python Packaging User Guide
|
||||||
Upgrading pip
|
Upgrading pip
|
||||||
=============
|
=============
|
||||||
|
|
||||||
On Linux or macOS::
|
.. tabs::
|
||||||
|
|
||||||
pip install -U pip
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
On Windows [4]_::
|
|
||||||
|
|
||||||
python -m pip install -U pip
|
python -m pip install -U pip
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install -U pip
|
||||||
|
|
||||||
|
|
||||||
.. _compatibility-requirements:
|
.. _compatibility-requirements:
|
||||||
|
|
||||||
|
@ -134,5 +198,3 @@ pip works on Unix/Linux, macOS, and Windows.
|
||||||
``--user`` installs for pip itself, should not be considered to be fully
|
``--user`` installs for pip itself, should not be considered to be fully
|
||||||
tested or endorsed. For discussion, see `Issue 1668
|
tested or endorsed. For discussion, see `Issue 1668
|
||||||
<https://github.com/pypa/pip/issues/1668>`_.
|
<https://github.com/pypa/pip/issues/1668>`_.
|
||||||
|
|
||||||
.. [4] https://github.com/pypa/pip/issues/1299
|
|
||||||
|
|
|
@ -6,27 +6,69 @@ First, :doc:`install pip <installing>`.
|
||||||
|
|
||||||
Install a package from `PyPI`_:
|
Install a package from `PyPI`_:
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip install SomePackage
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip install SomePackage
|
||||||
[...]
|
[...]
|
||||||
Successfully installed SomePackage
|
Successfully installed SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip install SomePackage
|
||||||
|
[...]
|
||||||
|
Successfully installed SomePackage
|
||||||
|
|
||||||
|
|
||||||
Install a package that's already been downloaded from `PyPI`_ or
|
Install a package that's already been downloaded from `PyPI`_ or
|
||||||
obtained from elsewhere. This is useful if the target machine does not have a
|
obtained from elsewhere. This is useful if the target machine does not have a
|
||||||
network connection:
|
network connection:
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip install SomePackage-1.0-py2.py3-none-any.whl
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip install SomePackage-1.0-py2.py3-none-any.whl
|
||||||
[...]
|
[...]
|
||||||
Successfully installed SomePackage
|
Successfully installed SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip install SomePackage-1.0-py2.py3-none-any.whl
|
||||||
|
[...]
|
||||||
|
Successfully installed SomePackage
|
||||||
|
|
||||||
|
|
||||||
Show what files were installed:
|
Show what files were installed:
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip show --files SomePackage
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip show --files SomePackage
|
||||||
|
Name: SomePackage
|
||||||
|
Version: 1.0
|
||||||
|
Location: /my/env/lib/pythonx.x/site-packages
|
||||||
|
Files:
|
||||||
|
../somepackage/__init__.py
|
||||||
|
[...]
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip show --files SomePackage
|
||||||
Name: SomePackage
|
Name: SomePackage
|
||||||
Version: 1.0
|
Version: 1.0
|
||||||
Location: /my/env/lib/pythonx.x/site-packages
|
Location: /my/env/lib/pythonx.x/site-packages
|
||||||
|
@ -36,16 +78,43 @@ Show what files were installed:
|
||||||
|
|
||||||
List what packages are outdated:
|
List what packages are outdated:
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip list --outdated
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list --outdated
|
||||||
|
SomePackage (Current: 1.0 Latest: 2.0)
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list --outdated
|
||||||
SomePackage (Current: 1.0 Latest: 2.0)
|
SomePackage (Current: 1.0 Latest: 2.0)
|
||||||
|
|
||||||
Upgrade a package:
|
Upgrade a package:
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip install --upgrade SomePackage
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip install --upgrade SomePackage
|
||||||
|
[...]
|
||||||
|
Found existing installation: SomePackage 1.0
|
||||||
|
Uninstalling SomePackage:
|
||||||
|
Successfully uninstalled SomePackage
|
||||||
|
Running setup.py install for SomePackage
|
||||||
|
Successfully installed SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip install --upgrade SomePackage
|
||||||
[...]
|
[...]
|
||||||
Found existing installation: SomePackage 1.0
|
Found existing installation: SomePackage 1.0
|
||||||
Uninstalling SomePackage:
|
Uninstalling SomePackage:
|
||||||
|
@ -55,9 +124,23 @@ Upgrade a package:
|
||||||
|
|
||||||
Uninstall a package:
|
Uninstall a package:
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip uninstall SomePackage
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip uninstall SomePackage
|
||||||
|
Uninstalling SomePackage:
|
||||||
|
/my/env/lib/pythonx.x/site-packages/somepackage
|
||||||
|
Proceed (y/n)? y
|
||||||
|
Successfully uninstalled SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip uninstall SomePackage
|
||||||
Uninstalling SomePackage:
|
Uninstalling SomePackage:
|
||||||
/my/env/lib/pythonx.x/site-packages/somepackage
|
/my/env/lib/pythonx.x/site-packages/somepackage
|
||||||
Proceed (y/n)? y
|
Proceed (y/n)? y
|
||||||
|
|
|
@ -7,10 +7,19 @@ pip
|
||||||
Usage
|
Usage
|
||||||
*****
|
*****
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
pip <command> [options]
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip <command> [options]
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip <command> [options]
|
||||||
|
|
||||||
Description
|
Description
|
||||||
***********
|
***********
|
||||||
|
@ -221,10 +230,22 @@ Build Options
|
||||||
The ``--global-option`` and ``--build-option`` arguments to the ``pip install``
|
The ``--global-option`` and ``--build-option`` arguments to the ``pip install``
|
||||||
and ``pip wheel`` inject additional arguments into the ``setup.py`` command
|
and ``pip wheel`` inject additional arguments into the ``setup.py`` command
|
||||||
(``--build-option`` is only available in ``pip wheel``). These arguments are
|
(``--build-option`` is only available in ``pip wheel``). These arguments are
|
||||||
included in the command as follows::
|
included in the command as follows:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
python setup.py <global_options> BUILD COMMAND <build_options>
|
python setup.py <global_options> BUILD COMMAND <build_options>
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py setup.py <global_options> BUILD COMMAND <build_options>
|
||||||
|
|
||||||
The options are passed unmodified, and presently offer direct access to the
|
The options are passed unmodified, and presently offer direct access to the
|
||||||
distutils command line. Use of ``--global-option`` and ``--build-option``
|
distutils command line. Use of ``--global-option`` and ``--build-option``
|
||||||
should be considered as build system dependent, and may not be supported in the
|
should be considered as build system dependent, and may not be supported in the
|
||||||
|
|
|
@ -9,7 +9,15 @@ pip cache
|
||||||
Usage
|
Usage
|
||||||
*****
|
*****
|
||||||
|
|
||||||
.. pip-command-usage:: cache
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: cache "python -m pip"
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: cache "py -m pip"
|
||||||
|
|
||||||
Description
|
Description
|
||||||
***********
|
***********
|
||||||
|
|
|
@ -10,7 +10,15 @@ pip check
|
||||||
Usage
|
Usage
|
||||||
=====
|
=====
|
||||||
|
|
||||||
.. pip-command-usage:: check
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: check "python -m pip"
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: check "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
Description
|
Description
|
||||||
|
@ -24,27 +32,66 @@ Examples
|
||||||
|
|
||||||
#. If all dependencies are compatible:
|
#. If all dependencies are compatible:
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip check
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip check
|
||||||
No broken requirements found.
|
No broken requirements found.
|
||||||
$ echo $?
|
$ echo $?
|
||||||
0
|
0
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip check
|
||||||
|
No broken requirements found.
|
||||||
|
C:\> echo %errorlevel%
|
||||||
|
0
|
||||||
|
|
||||||
#. If a package is missing:
|
#. If a package is missing:
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip check
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip check
|
||||||
pyramid 1.5.2 requires WebOb, which is not installed.
|
pyramid 1.5.2 requires WebOb, which is not installed.
|
||||||
$ echo $?
|
$ echo $?
|
||||||
1
|
1
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip check
|
||||||
|
pyramid 1.5.2 requires WebOb, which is not installed.
|
||||||
|
C:\> echo %errorlevel%
|
||||||
|
1
|
||||||
|
|
||||||
#. If a package has the wrong version:
|
#. If a package has the wrong version:
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip check
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip check
|
||||||
pyramid 1.5.2 has requirement WebOb>=1.3.1, but you have WebOb 0.8.
|
pyramid 1.5.2 has requirement WebOb>=1.3.1, but you have WebOb 0.8.
|
||||||
$ echo $?
|
$ echo $?
|
||||||
1
|
1
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip check
|
||||||
|
pyramid 1.5.2 has requirement WebOb>=1.3.1, but you have WebOb 0.8.
|
||||||
|
C:\> echo %errorlevel%
|
||||||
|
1
|
||||||
|
|
|
@ -11,7 +11,15 @@ pip config
|
||||||
Usage
|
Usage
|
||||||
=====
|
=====
|
||||||
|
|
||||||
.. pip-command-usage:: config
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: config "python -m pip"
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: config "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
Description
|
Description
|
||||||
|
|
|
@ -10,7 +10,15 @@ pip debug
|
||||||
Usage
|
Usage
|
||||||
=====
|
=====
|
||||||
|
|
||||||
.. pip-command-usage:: debug
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: debug "python -m pip"
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: debug "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
.. warning::
|
.. warning::
|
||||||
|
|
|
@ -11,7 +11,15 @@ pip download
|
||||||
Usage
|
Usage
|
||||||
=====
|
=====
|
||||||
|
|
||||||
.. pip-command-usage:: download
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: download "python -m pip"
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: download "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
Description
|
Description
|
||||||
|
@ -56,11 +64,24 @@ Examples
|
||||||
|
|
||||||
#. Download a package and all of its dependencies
|
#. Download a package and all of its dependencies
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip download SomePackage
|
||||||
|
python -m pip download -d . SomePackage # equivalent to above
|
||||||
|
python -m pip download --no-index --find-links=/tmp/wheelhouse -d /tmp/otherwheelhouse SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip download SomePackage
|
||||||
|
py -m pip download -d . SomePackage # equivalent to above
|
||||||
|
py -m pip download --no-index --find-links=/tmp/wheelhouse -d /tmp/otherwheelhouse SomePackage
|
||||||
|
|
||||||
$ pip download SomePackage
|
|
||||||
$ pip download -d . SomePackage # equivalent to above
|
|
||||||
$ pip download --no-index --find-links=/tmp/wheelhouse -d /tmp/otherwheelhouse SomePackage
|
|
||||||
|
|
||||||
#. Download a package and all of its dependencies with OSX specific interpreter constraints.
|
#. Download a package and all of its dependencies with OSX specific interpreter constraints.
|
||||||
This forces OSX 10.10 or lower compatibility. Since OSX deps are forward compatible,
|
This forces OSX 10.10 or lower compatibility. Since OSX deps are forward compatible,
|
||||||
|
@ -69,22 +90,41 @@ Examples
|
||||||
It will also match deps with platform ``any``. Also force the interpreter version to ``27``
|
It will also match deps with platform ``any``. Also force the interpreter version to ``27``
|
||||||
(or more generic, i.e. ``2``) and implementation to ``cp`` (or more generic, i.e. ``py``).
|
(or more generic, i.e. ``2``) and implementation to ``cp`` (or more generic, i.e. ``py``).
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip download \
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip download \
|
||||||
--only-binary=:all: \
|
--only-binary=:all: \
|
||||||
--platform macosx-10_10_x86_64 \
|
--platform macosx-10_10_x86_64 \
|
||||||
--python-version 27 \
|
--python-version 27 \
|
||||||
--implementation cp \
|
--implementation cp \
|
||||||
SomePackage
|
SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip download ^
|
||||||
|
--only-binary=:all: ^
|
||||||
|
--platform macosx-10_10_x86_64 ^
|
||||||
|
--python-version 27 ^
|
||||||
|
--implementation cp ^
|
||||||
|
SomePackage
|
||||||
|
|
||||||
#. Download a package and its dependencies with linux specific constraints.
|
#. Download a package and its dependencies with linux specific constraints.
|
||||||
Force the interpreter to be any minor version of py3k, and only accept
|
Force the interpreter to be any minor version of py3k, and only accept
|
||||||
``cp34m`` or ``none`` as the abi.
|
``cp34m`` or ``none`` as the abi.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip download \
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip download \
|
||||||
--only-binary=:all: \
|
--only-binary=:all: \
|
||||||
--platform linux_x86_64 \
|
--platform linux_x86_64 \
|
||||||
--python-version 3 \
|
--python-version 3 \
|
||||||
|
@ -92,11 +132,27 @@ Examples
|
||||||
--abi cp34m \
|
--abi cp34m \
|
||||||
SomePackage
|
SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip download ^
|
||||||
|
--only-binary=:all: ^
|
||||||
|
--platform linux_x86_64 ^
|
||||||
|
--python-version 3 ^
|
||||||
|
--implementation cp ^
|
||||||
|
--abi cp34m ^
|
||||||
|
SomePackage
|
||||||
|
|
||||||
#. Force platform, implementation, and abi agnostic deps.
|
#. Force platform, implementation, and abi agnostic deps.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip download \
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip download \
|
||||||
--only-binary=:all: \
|
--only-binary=:all: \
|
||||||
--platform any \
|
--platform any \
|
||||||
--python-version 3 \
|
--python-version 3 \
|
||||||
|
@ -104,16 +160,52 @@ Examples
|
||||||
--abi none \
|
--abi none \
|
||||||
SomePackage
|
SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip download ^
|
||||||
|
--only-binary=:all: ^
|
||||||
|
--platform any ^
|
||||||
|
--python-version 3 ^
|
||||||
|
--implementation py ^
|
||||||
|
--abi none ^
|
||||||
|
SomePackage
|
||||||
|
|
||||||
#. Even when overconstrained, this will still correctly fetch the pip universal wheel.
|
#. Even when overconstrained, this will still correctly fetch the pip universal wheel.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip download \
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip download \
|
||||||
--only-binary=:all: \
|
--only-binary=:all: \
|
||||||
--platform linux_x86_64 \
|
--platform linux_x86_64 \
|
||||||
--python-version 33 \
|
--python-version 33 \
|
||||||
--implementation cp \
|
--implementation cp \
|
||||||
--abi cp34m \
|
--abi cp34m \
|
||||||
pip>=8
|
pip>=8
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
$ ls pip-8.1.1-py2.py3-none-any.whl
|
$ ls pip-8.1.1-py2.py3-none-any.whl
|
||||||
pip-8.1.1-py2.py3-none-any.whl
|
pip-8.1.1-py2.py3-none-any.whl
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip download ^
|
||||||
|
--only-binary=:all: ^
|
||||||
|
--platform linux_x86_64 ^
|
||||||
|
--python-version 33 ^
|
||||||
|
--implementation cp ^
|
||||||
|
--abi cp34m ^
|
||||||
|
pip>=8
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> dir pip-8.1.1-py2.py3-none-any.whl
|
||||||
|
pip-8.1.1-py2.py3-none-any.whl
|
||||||
|
|
|
@ -11,7 +11,15 @@ pip freeze
|
||||||
Usage
|
Usage
|
||||||
=====
|
=====
|
||||||
|
|
||||||
.. pip-command-usage:: freeze
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: freeze "python -m pip"
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: freeze "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
Description
|
Description
|
||||||
|
@ -31,9 +39,24 @@ Examples
|
||||||
|
|
||||||
#. Generate output suitable for a requirements file.
|
#. Generate output suitable for a requirements file.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip freeze
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip freeze
|
||||||
|
docutils==0.11
|
||||||
|
Jinja2==2.7.2
|
||||||
|
MarkupSafe==0.19
|
||||||
|
Pygments==1.6
|
||||||
|
Sphinx==1.2.2
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip freeze
|
||||||
docutils==0.11
|
docutils==0.11
|
||||||
Jinja2==2.7.2
|
Jinja2==2.7.2
|
||||||
MarkupSafe==0.19
|
MarkupSafe==0.19
|
||||||
|
@ -43,7 +66,18 @@ Examples
|
||||||
|
|
||||||
#. Generate a requirements file and then install from it in another environment.
|
#. Generate a requirements file and then install from it in another environment.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ env1/bin/pip freeze > requirements.txt
|
.. group-tab:: Unix/macOS
|
||||||
$ env2/bin/pip install -r requirements.txt
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
env1/bin/python -m pip freeze > requirements.txt
|
||||||
|
env2/bin/python -m pip install -r requirements.txt
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
env1\bin\python -m pip freeze > requirements.txt
|
||||||
|
env2\bin\python -m pip install -r requirements.txt
|
||||||
|
|
|
@ -10,7 +10,15 @@ pip hash
|
||||||
Usage
|
Usage
|
||||||
=====
|
=====
|
||||||
|
|
||||||
.. pip-command-usage:: hash
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: hash "python -m pip"
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: hash "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
Description
|
Description
|
||||||
|
@ -39,13 +47,32 @@ Options
|
||||||
Example
|
Example
|
||||||
=======
|
=======
|
||||||
|
|
||||||
Compute the hash of a downloaded archive::
|
Compute the hash of a downloaded archive:
|
||||||
|
|
||||||
$ pip download SomePackage
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip download SomePackage
|
||||||
Collecting SomePackage
|
Collecting SomePackage
|
||||||
Downloading SomePackage-2.2.tar.gz
|
Downloading SomePackage-2.2.tar.gz
|
||||||
Saved ./pip_downloads/SomePackage-2.2.tar.gz
|
Saved ./pip_downloads/SomePackage-2.2.tar.gz
|
||||||
Successfully downloaded SomePackage
|
Successfully downloaded SomePackage
|
||||||
$ pip hash ./pip_downloads/SomePackage-2.2.tar.gz
|
$ python -m pip hash ./pip_downloads/SomePackage-2.2.tar.gz
|
||||||
|
./pip_downloads/SomePackage-2.2.tar.gz:
|
||||||
|
--hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip download SomePackage
|
||||||
|
Collecting SomePackage
|
||||||
|
Downloading SomePackage-2.2.tar.gz
|
||||||
|
Saved ./pip_downloads/SomePackage-2.2.tar.gz
|
||||||
|
Successfully downloaded SomePackage
|
||||||
|
C:\> py -m pip hash ./pip_downloads/SomePackage-2.2.tar.gz
|
||||||
./pip_downloads/SomePackage-2.2.tar.gz:
|
./pip_downloads/SomePackage-2.2.tar.gz:
|
||||||
--hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
|
--hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
|
||||||
|
|
|
@ -10,7 +10,16 @@ pip install
|
||||||
Usage
|
Usage
|
||||||
=====
|
=====
|
||||||
|
|
||||||
.. pip-command-usage:: install
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: install "python -m pip"
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: install "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Description
|
Description
|
||||||
|
@ -89,13 +98,31 @@ implementation (which might possibly change later) has it such that the first
|
||||||
encountered member of the cycle is installed last.
|
encountered member of the cycle is installed last.
|
||||||
|
|
||||||
For instance, if quux depends on foo which depends on bar which depends on baz,
|
For instance, if quux depends on foo which depends on bar which depends on baz,
|
||||||
which depends on foo::
|
which depends on foo:
|
||||||
|
|
||||||
pip install quux
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip install quux
|
||||||
...
|
...
|
||||||
Installing collected packages baz, bar, foo, quux
|
Installing collected packages baz, bar, foo, quux
|
||||||
|
|
||||||
pip install bar
|
$ python -m pip install bar
|
||||||
|
...
|
||||||
|
Installing collected packages foo, baz, bar
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip install quux
|
||||||
|
...
|
||||||
|
Installing collected packages baz, bar, foo, quux
|
||||||
|
|
||||||
|
C:\> py -m pip install bar
|
||||||
...
|
...
|
||||||
Installing collected packages foo, baz, bar
|
Installing collected packages foo, baz, bar
|
||||||
|
|
||||||
|
@ -387,9 +414,21 @@ If your repository layout is::
|
||||||
└── some_file
|
└── some_file
|
||||||
some_other_file
|
some_other_file
|
||||||
|
|
||||||
Then, to install from this repository, the syntax would be::
|
Then, to install from this repository, the syntax would be:
|
||||||
|
|
||||||
$ pip install -e "vcs+protocol://repo_url/#egg=pkg&subdirectory=pkg_dir"
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install -e "vcs+protocol://repo_url/#egg=pkg&subdirectory=pkg_dir"
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install -e "vcs+protocol://repo_url/#egg=pkg&subdirectory=pkg_dir"
|
||||||
|
|
||||||
|
|
||||||
Git
|
Git
|
||||||
|
@ -636,9 +675,15 @@ against any requirement not only checks that hash but also activates a global
|
||||||
.. _`--require-hashes`:
|
.. _`--require-hashes`:
|
||||||
|
|
||||||
Hash-checking mode can be forced on with the ``--require-hashes`` command-line
|
Hash-checking mode can be forced on with the ``--require-hashes`` command-line
|
||||||
option::
|
option:
|
||||||
|
|
||||||
$ pip install --require-hashes -r requirements.txt
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip install --require-hashes -r requirements.txt
|
||||||
...
|
...
|
||||||
Hashes are required in --require-hashes mode (implicitly on when a hash is
|
Hashes are required in --require-hashes mode (implicitly on when a hash is
|
||||||
specified for any package). These requirements were missing hashes,
|
specified for any package). These requirements were missing hashes,
|
||||||
|
@ -648,6 +693,21 @@ option::
|
||||||
pyelasticsearch==1.0 --hash=sha256:44ddfb1225054d7d6b1d02e9338e7d4809be94edbe9929a2ec0807d38df993fa
|
pyelasticsearch==1.0 --hash=sha256:44ddfb1225054d7d6b1d02e9338e7d4809be94edbe9929a2ec0807d38df993fa
|
||||||
more-itertools==2.2 --hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
|
more-itertools==2.2 --hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip install --require-hashes -r requirements.txt
|
||||||
|
...
|
||||||
|
Hashes are required in --require-hashes mode (implicitly on when a hash is
|
||||||
|
specified for any package). These requirements were missing hashes,
|
||||||
|
leaving them open to tampering. These are the hashes the downloaded
|
||||||
|
archives actually had. You can add lines like these to your requirements
|
||||||
|
files to prevent tampering.
|
||||||
|
pyelasticsearch==1.0 --hash=sha256:44ddfb1225054d7d6b1d02e9338e7d4809be94edbe9929a2ec0807d38df993fa
|
||||||
|
more-itertools==2.2 --hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
|
||||||
|
|
||||||
|
|
||||||
This can be useful in deploy scripts, to ensure that the author of the
|
This can be useful in deploy scripts, to ensure that the author of the
|
||||||
requirements file provided hashes. It is also a convenient way to bootstrap
|
requirements file provided hashes. It is also a convenient way to bootstrap
|
||||||
your list of hashes, since it shows the hashes of the packages it fetched. It
|
your list of hashes, since it shows the hashes of the packages it fetched. It
|
||||||
|
@ -692,14 +752,38 @@ Hash-checking mode also works with :ref:`pip download` and :ref:`pip wheel`. A
|
||||||
as your project evolves. To be safe, install your project using pip and
|
as your project evolves. To be safe, install your project using pip and
|
||||||
:ref:`--no-deps <install_--no-deps>`.
|
:ref:`--no-deps <install_--no-deps>`.
|
||||||
|
|
||||||
Instead of ``python setup.py develop``, use... ::
|
Instead of ``python setup.py develop``, use...
|
||||||
|
|
||||||
pip install --no-deps -e .
|
.. tabs::
|
||||||
|
|
||||||
Instead of ``python setup.py install``, use... ::
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
pip install --no-deps .
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install --no-deps -e .
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install --no-deps -e .
|
||||||
|
|
||||||
|
|
||||||
|
Instead of ``python setup.py install``, use...
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install --no-deps .
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install --no-deps .
|
||||||
|
|
||||||
Hashes from PyPI
|
Hashes from PyPI
|
||||||
^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^
|
||||||
|
@ -717,9 +801,22 @@ Local project installs
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
pip supports installing local project in both regular mode and editable mode.
|
pip supports installing local project in both regular mode and editable mode.
|
||||||
You can install local projects by specifying the project path to pip::
|
You can install local projects by specifying the project path to pip:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install path/to/SomeProject
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install path/to/SomeProject
|
||||||
|
|
||||||
$ pip install path/to/SomeProject
|
|
||||||
|
|
||||||
During regular installation, pip will copy the entire project directory to a
|
During regular installation, pip will copy the entire project directory to a
|
||||||
temporary location and install from there. The exception is that pip will
|
temporary location and install from there. The exception is that pip will
|
||||||
|
@ -736,10 +833,24 @@ being copied.
|
||||||
<https://setuptools.readthedocs.io/en/latest/setuptools.html#development-mode>`_
|
<https://setuptools.readthedocs.io/en/latest/setuptools.html#development-mode>`_
|
||||||
installs.
|
installs.
|
||||||
|
|
||||||
You can install local projects or VCS projects in "editable" mode::
|
You can install local projects or VCS projects in "editable" mode:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install -e path/to/SomeProject
|
||||||
|
python -m pip install -e git+http://repo/my_project.git#egg=SomeProject
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install -e path/to/SomeProject
|
||||||
|
py -m pip install -e git+http://repo/my_project.git#egg=SomeProject
|
||||||
|
|
||||||
$ pip install -e path/to/SomeProject
|
|
||||||
$ pip install -e git+http://repo/my_project.git#egg=SomeProject
|
|
||||||
|
|
||||||
(See the :ref:`VCS Support` section above for more information on VCS-related syntax.)
|
(See the :ref:`VCS Support` section above for more information on VCS-related syntax.)
|
||||||
|
|
||||||
|
@ -846,113 +957,292 @@ Examples
|
||||||
|
|
||||||
#. Install ``SomePackage`` and its dependencies from `PyPI`_ using :ref:`Requirement Specifiers`
|
#. Install ``SomePackage`` and its dependencies from `PyPI`_ using :ref:`Requirement Specifiers`
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip install SomePackage # latest version
|
.. group-tab:: Unix/macOS
|
||||||
$ pip install SomePackage==1.0.4 # specific version
|
|
||||||
$ pip install 'SomePackage>=1.0.4' # minimum version
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install SomePackage # latest version
|
||||||
|
python -m pip install SomePackage==1.0.4 # specific version
|
||||||
|
python -m pip install 'SomePackage>=1.0.4' # minimum version
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install SomePackage # latest version
|
||||||
|
py -m pip install SomePackage==1.0.4 # specific version
|
||||||
|
py -m pip install 'SomePackage>=1.0.4' # minimum version
|
||||||
|
|
||||||
|
|
||||||
#. Install a list of requirements specified in a file. See the :ref:`Requirements files <Requirements Files>`.
|
#. Install a list of requirements specified in a file. See the :ref:`Requirements files <Requirements Files>`.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip install -r requirements.txt
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install -r requirements.txt
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install -r requirements.txt
|
||||||
|
|
||||||
|
|
||||||
#. Upgrade an already installed ``SomePackage`` to the latest from PyPI.
|
#. Upgrade an already installed ``SomePackage`` to the latest from PyPI.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip install --upgrade SomePackage
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install --upgrade SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install --upgrade SomePackage
|
||||||
|
|
||||||
|
|
||||||
#. Install a local project in "editable" mode. See the section on :ref:`Editable Installs <editable-installs>`.
|
#. Install a local project in "editable" mode. See the section on :ref:`Editable Installs <editable-installs>`.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip install -e . # project in current directory
|
.. group-tab:: Unix/macOS
|
||||||
$ pip install -e path/to/project # project in another directory
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install -e . # project in current directory
|
||||||
|
python -m pip install -e path/to/project # project in another directory
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install -e . # project in current directory
|
||||||
|
py -m pip install -e path/to/project # project in another directory
|
||||||
|
|
||||||
|
|
||||||
#. Install a project from VCS
|
#. Install a project from VCS
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip install SomeProject@git+https://git.repo/some_pkg.git@1.3.1
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install SomeProject@git+https://git.repo/some_pkg.git@1.3.1
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install SomeProject@git+https://git.repo/some_pkg.git@1.3.1
|
||||||
|
|
||||||
|
|
||||||
#. Install a project from VCS in "editable" mode. See the sections on :ref:`VCS Support <VCS Support>` and :ref:`Editable Installs <editable-installs>`.
|
#. Install a project from VCS in "editable" mode. See the sections on :ref:`VCS Support <VCS Support>` and :ref:`Editable Installs <editable-installs>`.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install -e git+https://git.repo/some_pkg.git#egg=SomePackage # from git
|
||||||
|
python -m pip install -e hg+https://hg.repo/some_pkg.git#egg=SomePackage # from mercurial
|
||||||
|
python -m python -m pip install -e svn+svn://svn.repo/some_pkg/trunk/#egg=SomePackage # from svn
|
||||||
|
python -m pip install -e git+https://git.repo/some_pkg.git@feature#egg=SomePackage # from 'feature' branch
|
||||||
|
python -m pip install -e "git+https://git.repo/some_repo.git#egg=subdir&subdirectory=subdir_path" # install a python package from a repo subdirectory
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install -e git+https://git.repo/some_pkg.git#egg=SomePackage # from git
|
||||||
|
py -m pip install -e hg+https://hg.repo/some_pkg.git#egg=SomePackage # from mercurial
|
||||||
|
py -m pip install -e svn+svn://svn.repo/some_pkg/trunk/#egg=SomePackage # from svn
|
||||||
|
py -m pip install -e git+https://git.repo/some_pkg.git@feature#egg=SomePackage # from 'feature' branch
|
||||||
|
py -m pip install -e "git+https://git.repo/some_repo.git#egg=subdir&subdirectory=subdir_path" # install a python package from a repo subdirectory
|
||||||
|
|
||||||
$ pip install -e git+https://git.repo/some_pkg.git#egg=SomePackage # from git
|
|
||||||
$ pip install -e hg+https://hg.repo/some_pkg.git#egg=SomePackage # from mercurial
|
|
||||||
$ pip install -e svn+svn://svn.repo/some_pkg/trunk/#egg=SomePackage # from svn
|
|
||||||
$ pip install -e git+https://git.repo/some_pkg.git@feature#egg=SomePackage # from 'feature' branch
|
|
||||||
$ pip install -e "git+https://git.repo/some_repo.git#egg=subdir&subdirectory=subdir_path" # install a python package from a repo subdirectory
|
|
||||||
|
|
||||||
#. Install a package with `setuptools extras`_.
|
#. Install a package with `setuptools extras`_.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip install SomePackage[PDF]
|
.. group-tab:: Unix/macOS
|
||||||
$ pip install "SomePackage[PDF] @ git+https://git.repo/SomePackage@master#subdirectory=subdir_path"
|
|
||||||
$ pip install .[PDF] # project in current directory
|
.. code-block:: shell
|
||||||
$ pip install SomePackage[PDF]==3.0
|
|
||||||
$ pip install SomePackage[PDF,EPUB] # multiple extras
|
python -m pip install SomePackage[PDF]
|
||||||
|
python -m pip install "SomePackage[PDF] @ git+https://git.repo/SomePackage@master#subdirectory=subdir_path"
|
||||||
|
python -m pip install .[PDF] # project in current directory
|
||||||
|
python -m pip install SomePackage[PDF]==3.0
|
||||||
|
python -m pip install SomePackage[PDF,EPUB] # multiple extras
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install SomePackage[PDF]
|
||||||
|
py -m pip install "SomePackage[PDF] @ git+https://git.repo/SomePackage@master#subdirectory=subdir_path"
|
||||||
|
py -m pip install .[PDF] # project in current directory
|
||||||
|
py -m pip install SomePackage[PDF]==3.0
|
||||||
|
py -m pip install SomePackage[PDF,EPUB] # multiple extras
|
||||||
|
|
||||||
|
|
||||||
#. Install a particular source archive file.
|
#. Install a particular source archive file.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip install ./downloads/SomePackage-1.0.4.tar.gz
|
.. group-tab:: Unix/macOS
|
||||||
$ pip install http://my.package.repo/SomePackage-1.0.4.zip
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install ./downloads/SomePackage-1.0.4.tar.gz
|
||||||
|
python -m pip install http://my.package.repo/SomePackage-1.0.4.zip
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install ./downloads/SomePackage-1.0.4.tar.gz
|
||||||
|
py -m pip install http://my.package.repo/SomePackage-1.0.4.zip
|
||||||
|
|
||||||
|
|
||||||
#. Install a particular source archive file following :pep:`440` direct references.
|
#. Install a particular source archive file following :pep:`440` direct references.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip install SomeProject@http://my.package.repo/SomeProject-1.2.3-py33-none-any.whl
|
.. group-tab:: Unix/macOS
|
||||||
$ pip install "SomeProject @ http://my.package.repo/SomeProject-1.2.3-py33-none-any.whl"
|
|
||||||
$ pip install SomeProject@http://my.package.repo/1.2.3.tar.gz
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install SomeProject@http://my.package.repo/SomeProject-1.2.3-py33-none-any.whl
|
||||||
|
python -m pip install "SomeProject @ http://my.package.repo/SomeProject-1.2.3-py33-none-any.whl"
|
||||||
|
python -m pip install SomeProject@http://my.package.repo/1.2.3.tar.gz
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install SomeProject@http://my.package.repo/SomeProject-1.2.3-py33-none-any.whl
|
||||||
|
py -m pip install "SomeProject @ http://my.package.repo/SomeProject-1.2.3-py33-none-any.whl"
|
||||||
|
py -m pip install SomeProject@http://my.package.repo/1.2.3.tar.gz
|
||||||
|
|
||||||
|
|
||||||
#. Install from alternative package repositories.
|
#. Install from alternative package repositories.
|
||||||
|
|
||||||
Install from a different index, and not `PyPI`_ ::
|
Install from a different index, and not `PyPI`_
|
||||||
|
|
||||||
$ pip install --index-url http://my.package.repo/simple/ SomePackage
|
.. tabs::
|
||||||
|
|
||||||
Search an additional index during install, in addition to `PyPI`_ ::
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
$ pip install --extra-index-url http://my.package.repo/simple SomePackage
|
.. code-block:: shell
|
||||||
|
|
||||||
Install from a local flat directory containing archives (and don't scan indexes)::
|
python -m pip install --index-url http://my.package.repo/simple/ SomePackage
|
||||||
|
|
||||||
$ pip install --no-index --find-links=file:///local/dir/ SomePackage
|
.. group-tab:: Windows
|
||||||
$ pip install --no-index --find-links=/local/dir/ SomePackage
|
|
||||||
$ pip install --no-index --find-links=relative/dir/ SomePackage
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install --index-url http://my.package.repo/simple/ SomePackage
|
||||||
|
|
||||||
|
|
||||||
|
Search an additional index during install, in addition to `PyPI`_
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install --extra-index-url http://my.package.repo/simple SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install --extra-index-url http://my.package.repo/simple SomePackage
|
||||||
|
|
||||||
|
|
||||||
|
Install from a local flat directory containing archives (and don't scan indexes):
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install --no-index --find-links=file:///local/dir/ SomePackage
|
||||||
|
python -m pip install --no-index --find-links=/local/dir/ SomePackage
|
||||||
|
python -m pip install --no-index --find-links=relative/dir/ SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install --no-index --find-links=file:///local/dir/ SomePackage
|
||||||
|
py -m pip install --no-index --find-links=/local/dir/ SomePackage
|
||||||
|
py -m pip install --no-index --find-links=relative/dir/ SomePackage
|
||||||
|
|
||||||
|
|
||||||
#. Find pre-release and development versions, in addition to stable versions. By default, pip only finds stable versions.
|
#. Find pre-release and development versions, in addition to stable versions. By default, pip only finds stable versions.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip install --pre SomePackage
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install --pre SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install --pre SomePackage
|
||||||
|
|
||||||
|
|
||||||
#. Install packages from source.
|
#. Install packages from source.
|
||||||
|
|
||||||
Do not use any binary packages::
|
Do not use any binary packages
|
||||||
|
|
||||||
$ pip install SomePackage1 SomePackage2 --no-binary :all:
|
.. tabs::
|
||||||
|
|
||||||
Specify ``SomePackage1`` to be installed from source::
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
$ pip install SomePackage1 SomePackage2 --no-binary SomePackage1
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install SomePackage1 SomePackage2 --no-binary :all:
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install SomePackage1 SomePackage2 --no-binary :all:
|
||||||
|
|
||||||
|
Specify ``SomePackage1`` to be installed from source:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install SomePackage1 SomePackage2 --no-binary SomePackage1
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install SomePackage1 SomePackage2 --no-binary SomePackage1
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,15 @@ pip list
|
||||||
Usage
|
Usage
|
||||||
=====
|
=====
|
||||||
|
|
||||||
.. pip-command-usage:: list
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: list "python -m pip"
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: list "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
Description
|
Description
|
||||||
|
@ -32,9 +40,24 @@ Examples
|
||||||
|
|
||||||
#. List installed packages.
|
#. List installed packages.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip list
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list
|
||||||
|
docutils (0.10)
|
||||||
|
Jinja2 (2.7.2)
|
||||||
|
MarkupSafe (0.18)
|
||||||
|
Pygments (1.6)
|
||||||
|
Sphinx (1.2.1)
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list
|
||||||
docutils (0.10)
|
docutils (0.10)
|
||||||
Jinja2 (2.7.2)
|
Jinja2 (2.7.2)
|
||||||
MarkupSafe (0.18)
|
MarkupSafe (0.18)
|
||||||
|
@ -43,17 +66,45 @@ Examples
|
||||||
|
|
||||||
#. List outdated packages (excluding editables), and the latest version available.
|
#. List outdated packages (excluding editables), and the latest version available.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip list --outdated
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list --outdated
|
||||||
docutils (Current: 0.10 Latest: 0.11)
|
docutils (Current: 0.10 Latest: 0.11)
|
||||||
Sphinx (Current: 1.2.1 Latest: 1.2.2)
|
Sphinx (Current: 1.2.1 Latest: 1.2.2)
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list --outdated
|
||||||
|
docutils (Current: 0.10 Latest: 0.11)
|
||||||
|
Sphinx (Current: 1.2.1 Latest: 1.2.2)
|
||||||
|
|
||||||
|
|
||||||
#. List installed packages with column formatting.
|
#. List installed packages with column formatting.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip list --format columns
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list --format columns
|
||||||
|
Package Version
|
||||||
|
------- -------
|
||||||
|
docopt 0.6.2
|
||||||
|
idlex 1.13
|
||||||
|
jedi 0.9.0
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list --format columns
|
||||||
Package Version
|
Package Version
|
||||||
------- -------
|
------- -------
|
||||||
docopt 0.6.2
|
docopt 0.6.2
|
||||||
|
@ -62,9 +113,23 @@ Examples
|
||||||
|
|
||||||
#. List outdated packages with column formatting.
|
#. List outdated packages with column formatting.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip list -o --format columns
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list -o --format columns
|
||||||
|
Package Version Latest Type
|
||||||
|
---------- ------- ------ -----
|
||||||
|
retry 0.8.1 0.9.1 wheel
|
||||||
|
setuptools 20.6.7 21.0.0 wheel
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list -o --format columns
|
||||||
Package Version Latest Type
|
Package Version Latest Type
|
||||||
---------- ------- ------ -----
|
---------- ------- ------ -----
|
||||||
retry 0.8.1 0.9.1 wheel
|
retry 0.8.1 0.9.1 wheel
|
||||||
|
@ -73,16 +138,41 @@ Examples
|
||||||
#. List packages that are not dependencies of other packages. Can be combined with
|
#. List packages that are not dependencies of other packages. Can be combined with
|
||||||
other options.
|
other options.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip list --outdated --not-required
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list --outdated --not-required
|
||||||
|
docutils (Current: 0.10 Latest: 0.11)
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list --outdated --not-required
|
||||||
docutils (Current: 0.10 Latest: 0.11)
|
docutils (Current: 0.10 Latest: 0.11)
|
||||||
|
|
||||||
#. Use legacy formatting
|
#. Use legacy formatting
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip list --format=legacy
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list --format=legacy
|
||||||
|
colorama (0.3.7)
|
||||||
|
docopt (0.6.2)
|
||||||
|
idlex (1.13)
|
||||||
|
jedi (0.9.0)
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list --format=legacy
|
||||||
colorama (0.3.7)
|
colorama (0.3.7)
|
||||||
docopt (0.6.2)
|
docopt (0.6.2)
|
||||||
idlex (1.13)
|
idlex (1.13)
|
||||||
|
@ -90,16 +180,41 @@ Examples
|
||||||
|
|
||||||
#. Use json formatting
|
#. Use json formatting
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip list --format=json
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list --format=json
|
||||||
|
[{'name': 'colorama', 'version': '0.3.7'}, {'name': 'docopt', 'version': '0.6.2'}, ...
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list --format=json
|
||||||
[{'name': 'colorama', 'version': '0.3.7'}, {'name': 'docopt', 'version': '0.6.2'}, ...
|
[{'name': 'colorama', 'version': '0.3.7'}, {'name': 'docopt', 'version': '0.6.2'}, ...
|
||||||
|
|
||||||
#. Use freeze formatting
|
#. Use freeze formatting
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip list --format=freeze
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list --format=freeze
|
||||||
|
colorama==0.3.7
|
||||||
|
docopt==0.6.2
|
||||||
|
idlex==1.13
|
||||||
|
jedi==0.9.0
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list --format=freeze
|
||||||
colorama==0.3.7
|
colorama==0.3.7
|
||||||
docopt==0.6.2
|
docopt==0.6.2
|
||||||
idlex==1.13
|
idlex==1.13
|
||||||
|
|
|
@ -10,7 +10,15 @@ pip search
|
||||||
Usage
|
Usage
|
||||||
=====
|
=====
|
||||||
|
|
||||||
.. pip-command-usage:: search
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: search "python -m pip"
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: search "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
Description
|
Description
|
||||||
|
@ -30,8 +38,20 @@ Examples
|
||||||
|
|
||||||
#. Search for "peppercorn"
|
#. Search for "peppercorn"
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip search peppercorn
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip search peppercorn
|
||||||
|
pepperedform - Helpers for using peppercorn with formprocess.
|
||||||
|
peppercorn - A library for converting a token stream into [...]
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip search peppercorn
|
||||||
pepperedform - Helpers for using peppercorn with formprocess.
|
pepperedform - Helpers for using peppercorn with formprocess.
|
||||||
peppercorn - A library for converting a token stream into [...]
|
peppercorn - A library for converting a token stream into [...]
|
||||||
|
|
|
@ -10,7 +10,15 @@ pip show
|
||||||
Usage
|
Usage
|
||||||
=====
|
=====
|
||||||
|
|
||||||
.. pip-command-usage:: show
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: show "python -m pip"
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: show "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
Description
|
Description
|
||||||
|
@ -30,9 +38,28 @@ Examples
|
||||||
|
|
||||||
#. Show information about a package:
|
#. Show information about a package:
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip show sphinx
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip show sphinx
|
||||||
|
Name: Sphinx
|
||||||
|
Version: 1.4.5
|
||||||
|
Summary: Python documentation generator
|
||||||
|
Home-page: http://sphinx-doc.org/
|
||||||
|
Author: Georg Brandl
|
||||||
|
Author-email: georg@python.org
|
||||||
|
License: BSD
|
||||||
|
Location: /my/env/lib/python2.7/site-packages
|
||||||
|
Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip show sphinx
|
||||||
Name: Sphinx
|
Name: Sphinx
|
||||||
Version: 1.4.5
|
Version: 1.4.5
|
||||||
Summary: Python documentation generator
|
Summary: Python documentation generator
|
||||||
|
@ -45,9 +72,56 @@ Examples
|
||||||
|
|
||||||
#. Show all information about a package
|
#. Show all information about a package
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip show --verbose sphinx
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip show --verbose sphinx
|
||||||
|
Name: Sphinx
|
||||||
|
Version: 1.4.5
|
||||||
|
Summary: Python documentation generator
|
||||||
|
Home-page: http://sphinx-doc.org/
|
||||||
|
Author: Georg Brandl
|
||||||
|
Author-email: georg@python.org
|
||||||
|
License: BSD
|
||||||
|
Location: /my/env/lib/python2.7/site-packages
|
||||||
|
Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
|
||||||
|
Metadata-Version: 2.0
|
||||||
|
Installer:
|
||||||
|
Classifiers:
|
||||||
|
Development Status :: 5 - Production/Stable
|
||||||
|
Environment :: Console
|
||||||
|
Environment :: Web Environment
|
||||||
|
Intended Audience :: Developers
|
||||||
|
Intended Audience :: Education
|
||||||
|
License :: OSI Approved :: BSD License
|
||||||
|
Operating System :: OS Independent
|
||||||
|
Programming Language :: Python
|
||||||
|
Programming Language :: Python :: 2
|
||||||
|
Programming Language :: Python :: 3
|
||||||
|
Framework :: Sphinx
|
||||||
|
Framework :: Sphinx :: Extension
|
||||||
|
Framework :: Sphinx :: Theme
|
||||||
|
Topic :: Documentation
|
||||||
|
Topic :: Documentation :: Sphinx
|
||||||
|
Topic :: Text Processing
|
||||||
|
Topic :: Utilities
|
||||||
|
Entry-points:
|
||||||
|
[console_scripts]
|
||||||
|
sphinx-apidoc = sphinx.apidoc:main
|
||||||
|
sphinx-autogen = sphinx.ext.autosummary.generate:main
|
||||||
|
sphinx-build = sphinx:main
|
||||||
|
sphinx-quickstart = sphinx.quickstart:main
|
||||||
|
[distutils.commands]
|
||||||
|
build_sphinx = sphinx.setup_command:BuildDoc
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip show --verbose sphinx
|
||||||
Name: Sphinx
|
Name: Sphinx
|
||||||
Version: 1.4.5
|
Version: 1.4.5
|
||||||
Summary: Python documentation generator
|
Summary: Python documentation generator
|
||||||
|
|
|
@ -10,7 +10,15 @@ pip uninstall
|
||||||
Usage
|
Usage
|
||||||
=====
|
=====
|
||||||
|
|
||||||
.. pip-command-usage:: uninstall
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: uninstall "python -m pip"
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: uninstall "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
Description
|
Description
|
||||||
|
@ -30,9 +38,24 @@ Examples
|
||||||
|
|
||||||
#. Uninstall a package.
|
#. Uninstall a package.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip uninstall simplejson
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip uninstall simplejson
|
||||||
|
Uninstalling simplejson:
|
||||||
|
/home/me/env/lib/python2.7/site-packages/simplejson
|
||||||
|
/home/me/env/lib/python2.7/site-packages/simplejson-2.2.1-py2.7.egg-info
|
||||||
|
Proceed (y/n)? y
|
||||||
|
Successfully uninstalled simplejson
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip uninstall simplejson
|
||||||
Uninstalling simplejson:
|
Uninstalling simplejson:
|
||||||
/home/me/env/lib/python2.7/site-packages/simplejson
|
/home/me/env/lib/python2.7/site-packages/simplejson
|
||||||
/home/me/env/lib/python2.7/site-packages/simplejson-2.2.1-py2.7.egg-info
|
/home/me/env/lib/python2.7/site-packages/simplejson-2.2.1-py2.7.egg-info
|
||||||
|
|
|
@ -11,7 +11,15 @@ pip wheel
|
||||||
Usage
|
Usage
|
||||||
=====
|
=====
|
||||||
|
|
||||||
.. pip-command-usage:: wheel
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: wheel "python -m pip"
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: wheel "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
Description
|
Description
|
||||||
|
@ -24,10 +32,23 @@ Build System Interface
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
In order for pip to build a wheel, ``setup.py`` must implement the
|
In order for pip to build a wheel, ``setup.py`` must implement the
|
||||||
``bdist_wheel`` command with the following syntax::
|
``bdist_wheel`` command with the following syntax:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
python setup.py bdist_wheel -d TARGET
|
python setup.py bdist_wheel -d TARGET
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py setup.py bdist_wheel -d TARGET
|
||||||
|
|
||||||
|
|
||||||
This command must create a wheel compatible with the invoking Python
|
This command must create a wheel compatible with the invoking Python
|
||||||
interpreter, and save that wheel in the directory TARGET.
|
interpreter, and save that wheel in the directory TARGET.
|
||||||
|
|
||||||
|
@ -39,9 +60,22 @@ Customising the build
|
||||||
It is possible using ``--global-option`` to include additional build commands
|
It is possible using ``--global-option`` to include additional build commands
|
||||||
with their arguments in the ``setup.py`` command. This is currently the only
|
with their arguments in the ``setup.py`` command. This is currently the only
|
||||||
way to influence the building of C extensions from the command line. For
|
way to influence the building of C extensions from the command line. For
|
||||||
example::
|
example:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip wheel --global-option bdist_ext --global-option -DFOO wheel
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip wheel --global-option bdist_ext --global-option -DFOO wheel
|
||||||
|
|
||||||
pip wheel --global-option bdist_ext --global-option -DFOO wheel
|
|
||||||
|
|
||||||
will result in a build command of
|
will result in a build command of
|
||||||
|
|
||||||
|
@ -69,13 +103,34 @@ Examples
|
||||||
|
|
||||||
#. Build wheels for a requirement (and all its dependencies), and then install
|
#. Build wheels for a requirement (and all its dependencies), and then install
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
|
.. group-tab:: Unix/macOS
|
||||||
$ pip install --no-index --find-links=/tmp/wheelhouse SomePackage
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
|
||||||
|
python -m pip install --no-index --find-links=/tmp/wheelhouse SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
|
||||||
|
py -m pip install --no-index --find-links=/tmp/wheelhouse SomePackage
|
||||||
|
|
||||||
#. Build a wheel for a package from source
|
#. Build a wheel for a package from source
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip wheel --no-binary SomePackage SomePackage
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip wheel --no-binary SomePackage SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip wheel --no-binary SomePackage SomePackage
|
||||||
|
|
|
@ -9,23 +9,28 @@ Running pip
|
||||||
===========
|
===========
|
||||||
|
|
||||||
pip is a command line program. When you install pip, a ``pip`` command is added
|
pip is a command line program. When you install pip, a ``pip`` command is added
|
||||||
to your system, which can be run from the command prompt as follows::
|
to your system, which can be run from the command prompt as follows:
|
||||||
|
|
||||||
$ pip <pip arguments>
|
.. tabs::
|
||||||
|
|
||||||
If you cannot run the ``pip`` command directly (possibly because the location
|
.. group-tab:: Unix/macOS
|
||||||
where it was installed isn't on your operating system's ``PATH``) then you can
|
|
||||||
run pip via the Python interpreter::
|
|
||||||
|
|
||||||
$ python -m pip <pip arguments>
|
.. code-block:: shell
|
||||||
|
|
||||||
On Windows, the ``py`` launcher can be used::
|
python -m pip <pip arguments>
|
||||||
|
|
||||||
$ py -m pip <pip arguments>
|
``python -m pip`` executes pip using the Python interpreter you
|
||||||
|
specified as python. So ``/usr/bin/python3.7 -m pip`` means
|
||||||
|
you are executing pip for your interpreter located at /usr/bin/python3.7.
|
||||||
|
|
||||||
Even though pip is available from your Python installation as an importable
|
.. group-tab:: Windows
|
||||||
module, via ``import pip``, it is *not supported* to use pip in this way. For
|
|
||||||
more details, see :ref:`Using pip from your program`.
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip <pip arguments>
|
||||||
|
|
||||||
|
``py -m pip`` executes pip using the latest Python interpreter you
|
||||||
|
have installed. For more details, read the `Python Windows launcher`_ docs.
|
||||||
|
|
||||||
|
|
||||||
Installing Packages
|
Installing Packages
|
||||||
|
@ -36,12 +41,25 @@ directly from distribution files.
|
||||||
|
|
||||||
|
|
||||||
The most common scenario is to install from `PyPI`_ using :ref:`Requirement
|
The most common scenario is to install from `PyPI`_ using :ref:`Requirement
|
||||||
Specifiers` ::
|
Specifiers`
|
||||||
|
|
||||||
$ pip install SomePackage # latest version
|
.. tabs::
|
||||||
$ pip install SomePackage==1.0.4 # specific version
|
|
||||||
$ pip install 'SomePackage>=1.0.4' # minimum version
|
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install SomePackage # latest version
|
||||||
|
python -m pip install SomePackage==1.0.4 # specific version
|
||||||
|
python -m pip install 'SomePackage>=1.0.4' # minimum version
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install SomePackage # latest version
|
||||||
|
py -m pip install SomePackage==1.0.4 # specific version
|
||||||
|
py -m pip install 'SomePackage>=1.0.4' # minimum version
|
||||||
|
|
||||||
For more information and examples, see the :ref:`pip install` reference.
|
For more information and examples, see the :ref:`pip install` reference.
|
||||||
|
|
||||||
|
@ -77,6 +95,47 @@ as the "username" and do not provide a password, for example -
|
||||||
``https://0123456789abcdef@pypi.company.com``
|
``https://0123456789abcdef@pypi.company.com``
|
||||||
|
|
||||||
|
|
||||||
|
netrc Support
|
||||||
|
-------------
|
||||||
|
|
||||||
|
If no credentials are part of the URL, pip will attempt to get authentication credentials
|
||||||
|
for the URL’s hostname from the user’s .netrc file. This behaviour comes from the underlying
|
||||||
|
use of `requests`_ which in turn delegates it to the `Python standard library`_.
|
||||||
|
|
||||||
|
The .netrc file contains login and initialization information used by the auto-login process.
|
||||||
|
It resides in the user's home directory. The .netrc file format is simple. You specify lines
|
||||||
|
with a machine name and follow that with lines for the login and password that are
|
||||||
|
associated with that machine. Machine name is the hostname in your URL.
|
||||||
|
|
||||||
|
An example .netrc for the host example.com with a user named 'daniel', using the password
|
||||||
|
'qwerty' would look like:
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
machine example.com
|
||||||
|
login daniel
|
||||||
|
password qwerty
|
||||||
|
|
||||||
|
As mentioned in the `standard library docs <https://docs.python.org/3/library/netrc.html>`_,
|
||||||
|
only ASCII characters are allowed. Whitespace and non-printable characters are not allowed in passwords.
|
||||||
|
|
||||||
|
|
||||||
|
Keyring Support
|
||||||
|
---------------
|
||||||
|
|
||||||
|
pip also supports credentials stored in your keyring using the `keyring`_
|
||||||
|
library. Note that ``keyring`` will need to be installed separately, as pip
|
||||||
|
does not come with it included.
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
pip install keyring
|
||||||
|
echo your-password | keyring set pypi.company.com your-username
|
||||||
|
pip install your-package --extra-index-url https://pypi.company.com/
|
||||||
|
|
||||||
|
.. _keyring: https://pypi.org/project/keyring/
|
||||||
|
|
||||||
|
|
||||||
Using a Proxy Server
|
Using a Proxy Server
|
||||||
====================
|
====================
|
||||||
|
|
||||||
|
@ -101,10 +160,21 @@ Requirements Files
|
||||||
==================
|
==================
|
||||||
|
|
||||||
"Requirements files" are files containing a list of items to be
|
"Requirements files" are files containing a list of items to be
|
||||||
installed using :ref:`pip install` like so::
|
installed using :ref:`pip install` like so:
|
||||||
|
|
||||||
pip install -r requirements.txt
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install -r requirements.txt
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install -r requirements.txt
|
||||||
|
|
||||||
Details on the format of the files are here: :ref:`Requirements File Format`.
|
Details on the format of the files are here: :ref:`Requirements File Format`.
|
||||||
|
|
||||||
|
@ -119,10 +189,21 @@ In practice, there are 4 common uses of Requirements files:
|
||||||
this case, your requirement file contains a pinned version of everything that
|
this case, your requirement file contains a pinned version of everything that
|
||||||
was installed when ``pip freeze`` was run.
|
was installed when ``pip freeze`` was run.
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
pip freeze > requirements.txt
|
.. group-tab:: Unix/macOS
|
||||||
pip install -r requirements.txt
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip freeze > requirements.txt
|
||||||
|
python -m pip install -r requirements.txt
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip freeze > requirements.txt
|
||||||
|
py -m pip install -r requirements.txt
|
||||||
|
|
||||||
2. Requirements files are used to force pip to properly resolve dependencies.
|
2. Requirements files are used to force pip to properly resolve dependencies.
|
||||||
As it is now, pip `doesn't have true dependency resolution
|
As it is now, pip `doesn't have true dependency resolution
|
||||||
|
@ -187,9 +268,21 @@ contents is nearly identical to :ref:`Requirements Files`. There is one key
|
||||||
difference: Including a package in a constraints file does not trigger
|
difference: Including a package in a constraints file does not trigger
|
||||||
installation of the package.
|
installation of the package.
|
||||||
|
|
||||||
Use a constraints file like so::
|
Use a constraints file like so:
|
||||||
|
|
||||||
pip install -c constraints.txt
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install -c constraints.txt
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install -c constraints.txt
|
||||||
|
|
||||||
Constraints files are used for exactly the same reason as requirements files
|
Constraints files are used for exactly the same reason as requirements files
|
||||||
when you don't know exactly what things you want to install. For instance, say
|
when you don't know exactly what things you want to install. For instance, say
|
||||||
|
@ -227,9 +320,19 @@ archives.
|
||||||
|
|
||||||
To install directly from a wheel archive:
|
To install directly from a wheel archive:
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
pip install SomePackage-1.0-py2.py3-none-any.whl
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install SomePackage-1.0-py2.py3-none-any.whl
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install SomePackage-1.0-py2.py3-none-any.whl
|
||||||
|
|
||||||
|
|
||||||
For the cases where wheels are not available, pip offers :ref:`pip wheel` as a
|
For the cases where wheels are not available, pip offers :ref:`pip wheel` as a
|
||||||
|
@ -242,17 +345,38 @@ convenience, to build wheels for all your requirements and dependencies.
|
||||||
To build wheels for your requirements and all their dependencies to a local
|
To build wheels for your requirements and all their dependencies to a local
|
||||||
directory:
|
directory:
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
pip install wheel
|
.. group-tab:: Unix/macOS
|
||||||
pip wheel --wheel-dir=/local/wheels -r requirements.txt
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install wheel
|
||||||
|
python -m pip wheel --wheel-dir=/local/wheels -r requirements.txt
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install wheel
|
||||||
|
py -m pip wheel --wheel-dir=/local/wheels -r requirements.txt
|
||||||
|
|
||||||
And *then* to install those requirements just using your local directory of
|
And *then* to install those requirements just using your local directory of
|
||||||
wheels (and not from PyPI):
|
wheels (and not from PyPI):
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
pip install --no-index --find-links=/local/wheels -r requirements.txt
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install --no-index --find-links=/local/wheels -r requirements.txt
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install --no-index --find-links=/local/wheels -r requirements.txt
|
||||||
|
|
||||||
|
|
||||||
Uninstalling Packages
|
Uninstalling Packages
|
||||||
|
@ -260,9 +384,20 @@ Uninstalling Packages
|
||||||
|
|
||||||
pip is able to uninstall most packages like so:
|
pip is able to uninstall most packages like so:
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip uninstall SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip uninstall SomePackage
|
||||||
|
|
||||||
$ pip uninstall SomePackage
|
|
||||||
|
|
||||||
pip also performs an automatic uninstall of an old version of a package
|
pip also performs an automatic uninstall of an old version of a package
|
||||||
before upgrading to a newer version.
|
before upgrading to a newer version.
|
||||||
|
@ -275,28 +410,69 @@ Listing Packages
|
||||||
|
|
||||||
To list installed packages:
|
To list installed packages:
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip list
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list
|
||||||
docutils (0.9.1)
|
docutils (0.9.1)
|
||||||
Jinja2 (2.6)
|
Jinja2 (2.6)
|
||||||
Pygments (1.5)
|
Pygments (1.5)
|
||||||
Sphinx (1.1.2)
|
Sphinx (1.1.2)
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list
|
||||||
|
docutils (0.9.1)
|
||||||
|
Jinja2 (2.6)
|
||||||
|
Pygments (1.5)
|
||||||
|
Sphinx (1.1.2)
|
||||||
|
|
||||||
|
|
||||||
To list outdated packages, and show the latest version available:
|
To list outdated packages, and show the latest version available:
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip list --outdated
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list --outdated
|
||||||
docutils (Current: 0.9.1 Latest: 0.10)
|
docutils (Current: 0.9.1 Latest: 0.10)
|
||||||
Sphinx (Current: 1.1.2 Latest: 1.1.3)
|
Sphinx (Current: 1.1.2 Latest: 1.1.3)
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list --outdated
|
||||||
|
docutils (Current: 0.9.1 Latest: 0.10)
|
||||||
|
Sphinx (Current: 1.1.2 Latest: 1.1.3)
|
||||||
|
|
||||||
To show details about an installed package:
|
To show details about an installed package:
|
||||||
|
|
||||||
::
|
.. tabs::
|
||||||
|
|
||||||
$ pip show sphinx
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip show sphinx
|
||||||
|
---
|
||||||
|
Name: Sphinx
|
||||||
|
Version: 1.1.3
|
||||||
|
Location: /my/env/lib/pythonx.x/site-packages
|
||||||
|
Requires: Pygments, Jinja2, docutils
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip show sphinx
|
||||||
---
|
---
|
||||||
Name: Sphinx
|
Name: Sphinx
|
||||||
Version: 1.1.3
|
Version: 1.1.3
|
||||||
|
@ -312,9 +488,21 @@ Searching for Packages
|
||||||
======================
|
======================
|
||||||
|
|
||||||
pip can search `PyPI`_ for packages using the ``pip search``
|
pip can search `PyPI`_ for packages using the ``pip search``
|
||||||
command::
|
command:
|
||||||
|
|
||||||
$ pip search "query"
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip search "query"
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip search "query"
|
||||||
|
|
||||||
The query will be used to search the names and summaries of all
|
The query will be used to search the names and summaries of all
|
||||||
packages.
|
packages.
|
||||||
|
@ -436,6 +624,15 @@ and ``--no-cache-dir``, falsy values have to be used:
|
||||||
no-compile = no
|
no-compile = no
|
||||||
no-warn-script-location = false
|
no-warn-script-location = false
|
||||||
|
|
||||||
|
For options which can be repeated like ``--verbose`` and ``--quiet``,
|
||||||
|
a non-negative integer can be used to represent the level to be specified:
|
||||||
|
|
||||||
|
.. code-block:: ini
|
||||||
|
|
||||||
|
[global]
|
||||||
|
quiet = 0
|
||||||
|
verbose = 2
|
||||||
|
|
||||||
It is possible to append values to a section within a configuration file such as the pip.ini file.
|
It is possible to append values to a section within a configuration file such as the pip.ini file.
|
||||||
This is applicable to appending options like ``--find-links`` or ``--trusted-host``,
|
This is applicable to appending options like ``--find-links`` or ``--trusted-host``,
|
||||||
which can be written on multiple lines:
|
which can be written on multiple lines:
|
||||||
|
@ -465,22 +662,81 @@ pip's command line options can be set with environment variables using the
|
||||||
format ``PIP_<UPPER_LONG_NAME>`` . Dashes (``-``) have to be replaced with
|
format ``PIP_<UPPER_LONG_NAME>`` . Dashes (``-``) have to be replaced with
|
||||||
underscores (``_``).
|
underscores (``_``).
|
||||||
|
|
||||||
For example, to set the default timeout::
|
For example, to set the default timeout:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
export PIP_DEFAULT_TIMEOUT=60
|
export PIP_DEFAULT_TIMEOUT=60
|
||||||
|
|
||||||
This is the same as passing the option to pip directly::
|
.. group-tab:: Windows
|
||||||
|
|
||||||
pip --default-timeout=60 [...]
|
.. code-block:: shell
|
||||||
|
|
||||||
|
set PIP_DEFAULT_TIMEOUT=60
|
||||||
|
|
||||||
|
This is the same as passing the option to pip directly:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip --default-timeout=60 [...]
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip --default-timeout=60 [...]
|
||||||
|
|
||||||
For command line options which can be repeated, use a space to separate
|
For command line options which can be repeated, use a space to separate
|
||||||
multiple values. For example::
|
multiple values. For example:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
export PIP_FIND_LINKS="http://mirror1.example.com http://mirror2.example.com"
|
export PIP_FIND_LINKS="http://mirror1.example.com http://mirror2.example.com"
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
set PIP_FIND_LINKS="http://mirror1.example.com http://mirror2.example.com"
|
||||||
|
|
||||||
|
|
||||||
|
is the same as calling:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install --find-links=http://mirror1.example.com --find-links=http://mirror2.example.com
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install --find-links=http://mirror1.example.com --find-links=http://mirror2.example.com
|
||||||
|
|
||||||
|
|
||||||
|
Options that do not take a value, but can be repeated (such as ``--verbose``)
|
||||||
|
can be specified using the number of repetitions, so::
|
||||||
|
|
||||||
|
export PIP_VERBOSE=3
|
||||||
|
|
||||||
is the same as calling::
|
is the same as calling::
|
||||||
|
|
||||||
pip install --find-links=http://mirror1.example.com --find-links=http://mirror2.example.com
|
pip install -vvv
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
|
@ -514,15 +770,15 @@ pip comes with support for command line completion in bash, zsh and fish.
|
||||||
|
|
||||||
To setup for bash::
|
To setup for bash::
|
||||||
|
|
||||||
$ pip completion --bash >> ~/.profile
|
python -m pip completion --bash >> ~/.profile
|
||||||
|
|
||||||
To setup for zsh::
|
To setup for zsh::
|
||||||
|
|
||||||
$ pip completion --zsh >> ~/.zprofile
|
python -m pip completion --zsh >> ~/.zprofile
|
||||||
|
|
||||||
To setup for fish::
|
To setup for fish::
|
||||||
|
|
||||||
$ pip completion --fish > ~/.config/fish/completions/pip.fish
|
python -m pip completion --fish > ~/.config/fish/completions/pip.fish
|
||||||
|
|
||||||
Alternatively, you can use the result of the ``completion`` command directly
|
Alternatively, you can use the result of the ``completion`` command directly
|
||||||
with the eval function of your shell, e.g. by adding the following to your
|
with the eval function of your shell, e.g. by adding the following to your
|
||||||
|
@ -541,24 +797,59 @@ Installing from local packages
|
||||||
In some cases, you may want to install from local packages only, with no traffic
|
In some cases, you may want to install from local packages only, with no traffic
|
||||||
to PyPI.
|
to PyPI.
|
||||||
|
|
||||||
First, download the archives that fulfill your requirements::
|
First, download the archives that fulfill your requirements:
|
||||||
|
|
||||||
$ pip download --destination-directory DIR -r requirements.txt
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip download --destination-directory DIR -r requirements.txt
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip download --destination-directory DIR -r requirements.txt
|
||||||
|
|
||||||
|
|
||||||
Note that ``pip download`` will look in your wheel cache first, before
|
Note that ``pip download`` will look in your wheel cache first, before
|
||||||
trying to download from PyPI. If you've never installed your requirements
|
trying to download from PyPI. If you've never installed your requirements
|
||||||
before, you won't have a wheel cache for those items. In that case, if some of
|
before, you won't have a wheel cache for those items. In that case, if some of
|
||||||
your requirements don't come as wheels from PyPI, and you want wheels, then run
|
your requirements don't come as wheels from PyPI, and you want wheels, then run
|
||||||
this instead::
|
this instead:
|
||||||
|
|
||||||
$ pip wheel --wheel-dir DIR -r requirements.txt
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip wheel --wheel-dir DIR -r requirements.txt
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip wheel --wheel-dir DIR -r requirements.txt
|
||||||
|
|
||||||
Then, to install from local only, you'll be using :ref:`--find-links
|
Then, to install from local only, you'll be using :ref:`--find-links
|
||||||
<install_--find-links>` and :ref:`--no-index <install_--no-index>` like so::
|
<install_--find-links>` and :ref:`--no-index <install_--no-index>` like so:
|
||||||
|
|
||||||
$ pip install --no-index --find-links=DIR -r requirements.txt
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install --no-index --find-links=DIR -r requirements.txt
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install --no-index --find-links=DIR -r requirements.txt
|
||||||
|
|
||||||
|
|
||||||
"Only if needed" Recursive Upgrade
|
"Only if needed" Recursive Upgrade
|
||||||
|
@ -577,10 +868,24 @@ The default strategy is ``only-if-needed``. This was changed in pip 10.0 due to
|
||||||
the breaking nature of ``eager`` when upgrading conflicting dependencies.
|
the breaking nature of ``eager`` when upgrading conflicting dependencies.
|
||||||
|
|
||||||
As an historic note, an earlier "fix" for getting the ``only-if-needed``
|
As an historic note, an earlier "fix" for getting the ``only-if-needed``
|
||||||
behaviour was::
|
behaviour was:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install --upgrade --no-deps SomePackage
|
||||||
|
python -m pip install SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install --upgrade --no-deps SomePackage
|
||||||
|
py -m pip install SomePackage
|
||||||
|
|
||||||
pip install --upgrade --no-deps SomePackage
|
|
||||||
pip install SomePackage
|
|
||||||
|
|
||||||
A proposal for an ``upgrade-all`` command is being considered as a safer
|
A proposal for an ``upgrade-all`` command is being considered as a safer
|
||||||
alternative to the behaviour of eager upgrading.
|
alternative to the behaviour of eager upgrading.
|
||||||
|
@ -603,11 +908,23 @@ Moreover, the "user scheme" can be customized by setting the
|
||||||
``site.USER_BASE``.
|
``site.USER_BASE``.
|
||||||
|
|
||||||
To install "SomePackage" into an environment with site.USER_BASE customized to
|
To install "SomePackage" into an environment with site.USER_BASE customized to
|
||||||
'/myappenv', do the following::
|
'/myappenv', do the following:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
export PYTHONUSERBASE=/myappenv
|
export PYTHONUSERBASE=/myappenv
|
||||||
pip install --user SomePackage
|
python -m pip install --user SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
set PYTHONUSERBASE=c:/myappenv
|
||||||
|
py -m pip install --user SomePackage
|
||||||
|
|
||||||
``pip install --user`` follows four rules:
|
``pip install --user`` follows four rules:
|
||||||
|
|
||||||
|
@ -630,54 +947,125 @@ To install "SomePackage" into an environment with site.USER_BASE customized to
|
||||||
To make the rules clearer, here are some examples:
|
To make the rules clearer, here are some examples:
|
||||||
|
|
||||||
|
|
||||||
From within a ``--no-site-packages`` virtualenv (i.e. the default kind)::
|
From within a ``--no-site-packages`` virtualenv (i.e. the default kind):
|
||||||
|
|
||||||
$ pip install --user SomePackage
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip install --user SomePackage
|
||||||
|
Can not perform a '--user' install. User site-packages are not visible in this virtualenv.
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip install --user SomePackage
|
||||||
Can not perform a '--user' install. User site-packages are not visible in this virtualenv.
|
Can not perform a '--user' install. User site-packages are not visible in this virtualenv.
|
||||||
|
|
||||||
|
|
||||||
From within a ``--system-site-packages`` virtualenv where ``SomePackage==0.3``
|
From within a ``--system-site-packages`` virtualenv where ``SomePackage==0.3``
|
||||||
is already installed in the virtualenv::
|
is already installed in the virtualenv:
|
||||||
|
|
||||||
$ pip install --user SomePackage==0.4
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip install --user SomePackage==0.4
|
||||||
Will not install to the user site because it will lack sys.path precedence
|
Will not install to the user site because it will lack sys.path precedence
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
From within a real python, where ``SomePackage`` is *not* installed globally::
|
.. code-block:: console
|
||||||
|
|
||||||
$ pip install --user SomePackage
|
C:\> py -m pip install --user SomePackage==0.4
|
||||||
|
Will not install to the user site because it will lack sys.path precedence
|
||||||
|
|
||||||
|
From within a real python, where ``SomePackage`` is *not* installed globally:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip install --user SomePackage
|
||||||
[...]
|
[...]
|
||||||
Successfully installed SomePackage
|
Successfully installed SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip install --user SomePackage
|
||||||
|
[...]
|
||||||
|
Successfully installed SomePackage
|
||||||
|
|
||||||
From within a real python, where ``SomePackage`` *is* installed globally, but
|
From within a real python, where ``SomePackage`` *is* installed globally, but
|
||||||
is *not* the latest version::
|
is *not* the latest version:
|
||||||
|
|
||||||
$ pip install --user SomePackage
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip install --user SomePackage
|
||||||
[...]
|
[...]
|
||||||
Requirement already satisfied (use --upgrade to upgrade)
|
Requirement already satisfied (use --upgrade to upgrade)
|
||||||
|
$ python -m pip install --user --upgrade SomePackage
|
||||||
$ pip install --user --upgrade SomePackage
|
|
||||||
[...]
|
[...]
|
||||||
Successfully installed SomePackage
|
Successfully installed SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip install --user SomePackage
|
||||||
|
[...]
|
||||||
|
Requirement already satisfied (use --upgrade to upgrade)
|
||||||
|
C:\> py -m pip install --user --upgrade SomePackage
|
||||||
|
[...]
|
||||||
|
Successfully installed SomePackage
|
||||||
|
|
||||||
From within a real python, where ``SomePackage`` *is* installed globally, and
|
From within a real python, where ``SomePackage`` *is* installed globally, and
|
||||||
is the latest version::
|
is the latest version:
|
||||||
|
|
||||||
$ pip install --user SomePackage
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip install --user SomePackage
|
||||||
[...]
|
[...]
|
||||||
Requirement already satisfied (use --upgrade to upgrade)
|
Requirement already satisfied (use --upgrade to upgrade)
|
||||||
|
$ python -m pip install --user --upgrade SomePackage
|
||||||
$ pip install --user --upgrade SomePackage
|
|
||||||
[...]
|
[...]
|
||||||
Requirement already up-to-date: SomePackage
|
Requirement already up-to-date: SomePackage
|
||||||
|
|
||||||
# force the install
|
# force the install
|
||||||
$ pip install --user --ignore-installed SomePackage
|
$ python -m pip install --user --ignore-installed SomePackage
|
||||||
[...]
|
[...]
|
||||||
Successfully installed SomePackage
|
Successfully installed SomePackage
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip install --user SomePackage
|
||||||
|
[...]
|
||||||
|
Requirement already satisfied (use --upgrade to upgrade)
|
||||||
|
C:\> py -m pip install --user --upgrade SomePackage
|
||||||
|
[...]
|
||||||
|
Requirement already up-to-date: SomePackage
|
||||||
|
# force the install
|
||||||
|
C:\> py -m pip install --user --ignore-installed SomePackage
|
||||||
|
[...]
|
||||||
|
Successfully installed SomePackage
|
||||||
|
|
||||||
.. _`Repeatability`:
|
.. _`Repeatability`:
|
||||||
|
|
||||||
|
@ -742,7 +1130,7 @@ index servers are unavailable and avoids time-consuming recompilation. Create
|
||||||
an archive like this::
|
an archive like this::
|
||||||
|
|
||||||
$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
|
$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
|
||||||
$ pip wheel -r requirements.txt --wheel-dir=$tempdir
|
$ python -m pip wheel -r requirements.txt --wheel-dir=$tempdir
|
||||||
$ cwd=`pwd`
|
$ cwd=`pwd`
|
||||||
$ (cd "$tempdir"; tar -cjvf "$cwd/bundled.tar.bz2" *)
|
$ (cd "$tempdir"; tar -cjvf "$cwd/bundled.tar.bz2" *)
|
||||||
|
|
||||||
|
@ -750,10 +1138,10 @@ You can then install from the archive like this::
|
||||||
|
|
||||||
$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
|
$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
|
||||||
$ (cd $tempdir; tar -xvf /path/to/bundled.tar.bz2)
|
$ (cd $tempdir; tar -xvf /path/to/bundled.tar.bz2)
|
||||||
$ pip install --force-reinstall --ignore-installed --upgrade --no-index --no-deps $tempdir/*
|
$ python -m pip install --force-reinstall --ignore-installed --upgrade --no-index --no-deps $tempdir/*
|
||||||
|
|
||||||
Note that compiled packages are typically OS- and architecture-specific, so
|
Note that compiled packages are typically OS- and architecture-specific, so
|
||||||
these archives are not necessarily portable across machines.
|
these archives are not necessarily portable across macOShines.
|
||||||
|
|
||||||
Hash-checking mode can be used along with this method to ensure that future
|
Hash-checking mode can be used along with this method to ensure that future
|
||||||
archives are built with identical packages.
|
archives are built with identical packages.
|
||||||
|
@ -766,8 +1154,6 @@ archives are built with identical packages.
|
||||||
to use such a package, see :ref:`Controlling
|
to use such a package, see :ref:`Controlling
|
||||||
setup_requires<controlling-setup-requires>`.
|
setup_requires<controlling-setup-requires>`.
|
||||||
|
|
||||||
.. _`Using pip from your program`:
|
|
||||||
|
|
||||||
Fixing conflicting dependencies
|
Fixing conflicting dependencies
|
||||||
===============================
|
===============================
|
||||||
|
|
||||||
|
@ -785,10 +1171,22 @@ Understanding your error message
|
||||||
When you get a ``ResolutionImpossible`` error, you might see something
|
When you get a ``ResolutionImpossible`` error, you might see something
|
||||||
like this:
|
like this:
|
||||||
|
|
||||||
.. code-block:: console
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install package_coffee==0.44.1 package_tea==4.3.0
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install package_coffee==0.44.1 package_tea==4.3.0
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
$ pip install package_coffee==0.44.1 package_tea==4.3.0
|
|
||||||
...
|
|
||||||
Due to conflicting dependencies pip cannot install
|
Due to conflicting dependencies pip cannot install
|
||||||
package_coffee and package_tea:
|
package_coffee and package_tea:
|
||||||
- package_coffee depends on package_water<3.0.0,>=2.4.2
|
- package_coffee depends on package_water<3.0.0,>=2.4.2
|
||||||
|
@ -879,7 +1277,7 @@ the same version of ``package_water``, you might consider:
|
||||||
(e.g. ``pip install "package_coffee>0.44.*" "package_tea>4.0.0"``)
|
(e.g. ``pip install "package_coffee>0.44.*" "package_tea>4.0.0"``)
|
||||||
- Asking pip to install *any* version of ``package_coffee`` and ``package_tea``
|
- Asking pip to install *any* version of ``package_coffee`` and ``package_tea``
|
||||||
by removing the version specifiers altogether (e.g.
|
by removing the version specifiers altogether (e.g.
|
||||||
``pip install package_coffee package_tea``)
|
``python -m pip install package_coffee package_tea``)
|
||||||
|
|
||||||
In the second case, pip will automatically find a version of both
|
In the second case, pip will automatically find a version of both
|
||||||
``package_coffee`` and ``package_tea`` that depend on the same version of
|
``package_coffee`` and ``package_tea`` that depend on the same version of
|
||||||
|
@ -889,9 +1287,21 @@ In the second case, pip will automatically find a version of both
|
||||||
- ``package_tea 4.3.0`` which *also* depends on ``package_water 2.6.1``
|
- ``package_tea 4.3.0`` which *also* depends on ``package_water 2.6.1``
|
||||||
|
|
||||||
If you want to prioritize one package over another, you can add version
|
If you want to prioritize one package over another, you can add version
|
||||||
specifiers to *only* the more important package::
|
specifiers to *only* the more important package:
|
||||||
|
|
||||||
pip install package_coffee==0.44.1b0 package_tea
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip install package_coffee==0.44.1b0 package_tea
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip install package_coffee==0.44.1b0 package_tea
|
||||||
|
|
||||||
This will result in:
|
This will result in:
|
||||||
|
|
||||||
|
@ -957,6 +1367,8 @@ issue tracker`_ if you believe that your problem has exposed a bug in pip.
|
||||||
.. _"How do I ask a good question?": https://stackoverflow.com/help/how-to-ask
|
.. _"How do I ask a good question?": https://stackoverflow.com/help/how-to-ask
|
||||||
.. _pip issue tracker: https://github.com/pypa/pip/issues
|
.. _pip issue tracker: https://github.com/pypa/pip/issues
|
||||||
|
|
||||||
|
.. _`Using pip from your program`:
|
||||||
|
|
||||||
Using pip from your program
|
Using pip from your program
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
|
@ -1046,7 +1458,7 @@ The big change in this release is to the pip dependency resolver
|
||||||
within pip.
|
within pip.
|
||||||
|
|
||||||
Computers need to know the right order to install pieces of software
|
Computers need to know the right order to install pieces of software
|
||||||
("to install `x`, you need to install `y` first"). So, when Python
|
("to install ``x``, you need to install ``y`` first"). So, when Python
|
||||||
programmers share software as packages, they have to precisely describe
|
programmers share software as packages, they have to precisely describe
|
||||||
those installation prerequisites, and pip needs to navigate tricky
|
those installation prerequisites, and pip needs to navigate tricky
|
||||||
situations where it's getting conflicting instructions. This new
|
situations where it's getting conflicting instructions. This new
|
||||||
|
@ -1271,3 +1683,6 @@ announcements on the `low-traffic packaging announcements list`_ and
|
||||||
.. _low-traffic packaging announcements list: https://mail.python.org/mailman3/lists/pypi-announce.python.org/
|
.. _low-traffic packaging announcements list: https://mail.python.org/mailman3/lists/pypi-announce.python.org/
|
||||||
.. _our survey on upgrades that create conflicts: https://docs.google.com/forms/d/e/1FAIpQLSeBkbhuIlSofXqCyhi3kGkLmtrpPOEBwr6iJA6SzHdxWKfqdA/viewform
|
.. _our survey on upgrades that create conflicts: https://docs.google.com/forms/d/e/1FAIpQLSeBkbhuIlSofXqCyhi3kGkLmtrpPOEBwr6iJA6SzHdxWKfqdA/viewform
|
||||||
.. _the official Python blog: https://blog.python.org/
|
.. _the official Python blog: https://blog.python.org/
|
||||||
|
.. _requests: https://requests.readthedocs.io/en/master/user/authentication/#netrc-authentication
|
||||||
|
.. _Python standard library: https://docs.python.org/3/library/netrc.html
|
||||||
|
.. _Python Windows launcher: https://docs.python.org/3/using/windows.html#launcher
|
||||||
|
|
|
@ -15,11 +15,17 @@ from pip._internal.req.req_file import SUPPORTED_OPTIONS
|
||||||
|
|
||||||
class PipCommandUsage(rst.Directive):
|
class PipCommandUsage(rst.Directive):
|
||||||
required_arguments = 1
|
required_arguments = 1
|
||||||
|
optional_arguments = 3
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
cmd = create_command(self.arguments[0])
|
cmd = create_command(self.arguments[0])
|
||||||
|
cmd_prefix = 'python -m pip'
|
||||||
|
if len(self.arguments) > 1:
|
||||||
|
cmd_prefix = " ".join(self.arguments[1:])
|
||||||
|
cmd_prefix = cmd_prefix.strip('"')
|
||||||
|
cmd_prefix = cmd_prefix.strip("'")
|
||||||
usage = dedent(
|
usage = dedent(
|
||||||
cmd.usage.replace('%prog', 'pip {}'.format(cmd.name))
|
cmd.usage.replace('%prog', '{} {}'.format(cmd_prefix, cmd.name))
|
||||||
).strip()
|
).strip()
|
||||||
node = nodes.literal_block(usage, usage)
|
node = nodes.literal_block(usage, usage)
|
||||||
return [node]
|
return [node]
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Add documentation for '.netrc' support.
|
|
@ -0,0 +1 @@
|
||||||
|
Add OS tabs for OS-specific commands.
|
|
@ -0,0 +1,2 @@
|
||||||
|
New resolver: Avoid accessing indexes when the installed candidate is preferred
|
||||||
|
and considered good enough.
|
|
@ -0,0 +1,2 @@
|
||||||
|
Propagate ``--extra-index-url`` from requirements file properly to session auth,
|
||||||
|
so that keyring auth will work as expected.
|
|
@ -0,0 +1 @@
|
||||||
|
Deprecate support for Python 3.5
|
|
@ -0,0 +1 @@
|
||||||
|
Add option ``--format`` to subcommand ``list`` of ``pip cache``, with ``abspath`` choice to output the full path of a wheel file.
|
|
@ -0,0 +1 @@
|
||||||
|
Document that certain removals can be fast tracked.
|
|
@ -0,0 +1,4 @@
|
||||||
|
Allow specifying verbosity and quiet level via configuration files
|
||||||
|
and environment variables. Previously these options were treated as
|
||||||
|
boolean values when read from there while through CLI the level can be
|
||||||
|
specified.
|
|
@ -0,0 +1 @@
|
||||||
|
Add note and example on keyring support for index basic-auth
|
|
@ -0,0 +1,2 @@
|
||||||
|
Improve error message friendliness when an environment has packages with
|
||||||
|
corrupted metadata.
|
|
@ -0,0 +1,3 @@
|
||||||
|
List downloaded distributions before exiting ``pip download``
|
||||||
|
when using the new resolver to make the behavior the same as
|
||||||
|
that on the legacy resolver.
|
|
@ -0,0 +1,3 @@
|
||||||
|
Make the ``setup.py install`` deprecation warning less noisy. We warn only
|
||||||
|
when ``setup.py install`` succeeded and ``setup.py bdist_wheel`` failed, as
|
||||||
|
situations where both fails are most probably irrelevant to this deprecation.
|
|
@ -0,0 +1,2 @@
|
||||||
|
New resolver: Correctly respect ``Requires-Python`` metadata to reject
|
||||||
|
incompatible packages in ``--no-deps`` mode.
|
|
@ -0,0 +1 @@
|
||||||
|
Fix a broken slug anchor in user guide.
|
|
@ -0,0 +1 @@
|
||||||
|
Added initial UX feedback widgets to docs.
|
|
@ -0,0 +1,2 @@
|
||||||
|
New resolver: Pick up hash declarations in constraints files and use them to
|
||||||
|
filter available distributions.
|
|
@ -0,0 +1,3 @@
|
||||||
|
Check the download directory for existing wheels to possibly avoid
|
||||||
|
fetching metadata when the ``fast-deps`` feature is used with
|
||||||
|
``pip wheel`` and ``pip download``.
|
|
@ -0,0 +1 @@
|
||||||
|
Add ux documentation
|
|
@ -0,0 +1,2 @@
|
||||||
|
When installing a git URL that refers to a commit that is not available locally
|
||||||
|
after git clone, attempt to fetch it from the remote.
|
|
@ -0,0 +1,2 @@
|
||||||
|
Avoid polluting the destination directory by resolution artifacts
|
||||||
|
when the new resolver is used for ``pip download`` or ``pip wheel``.
|
|
@ -0,0 +1,3 @@
|
||||||
|
New resolver: If a package appears multiple times in user specification with
|
||||||
|
different ``--hash`` options, only hashes that present in all specifications
|
||||||
|
should be allowed.
|
|
@ -0,0 +1 @@
|
||||||
|
Added initial UX feedback widgets to docs.
|
|
@ -0,0 +1 @@
|
||||||
|
Tweak the output during dependency resolution in the new resolver.
|
|
@ -0,0 +1 @@
|
||||||
|
Include http subdirectory in ``pip cache info`` and ``pip cache purge`` commands.
|
|
@ -0,0 +1,3 @@
|
||||||
|
Cache package listings on index packages so they are guarenteed to stay stable
|
||||||
|
during a pip command session. This also improves performance when a index page
|
||||||
|
is accessed multiple times during the command session.
|
|
@ -0,0 +1,2 @@
|
||||||
|
New resolver: Tweak resolution logic to improve user experience when
|
||||||
|
user-supplied requirements conflict.
|
|
@ -0,0 +1 @@
|
||||||
|
Document that Python versions are generally supported until PyPI usage falls below 5%.
|
|
@ -0,0 +1,2 @@
|
||||||
|
Correctly search for installed distributions in new resolver logic in order
|
||||||
|
to not miss packages (virtualenv packages from system-wide-packages for example)
|
14
setup.cfg
14
setup.cfg
|
@ -1,4 +1,5 @@
|
||||||
[isort]
|
[isort]
|
||||||
|
profile = black
|
||||||
skip =
|
skip =
|
||||||
./build,
|
./build,
|
||||||
.nox,
|
.nox,
|
||||||
|
@ -6,16 +7,11 @@ skip =
|
||||||
.scratch,
|
.scratch,
|
||||||
_vendor,
|
_vendor,
|
||||||
data
|
data
|
||||||
multi_line_output = 3
|
|
||||||
known_third_party =
|
known_third_party =
|
||||||
pip._vendor
|
pip._vendor
|
||||||
known_first_party =
|
|
||||||
pip
|
|
||||||
tests
|
|
||||||
default_section = THIRDPARTY
|
|
||||||
include_trailing_comma = true
|
|
||||||
|
|
||||||
[flake8]
|
[flake8]
|
||||||
|
max-line-length = 88
|
||||||
exclude =
|
exclude =
|
||||||
./build,
|
./build,
|
||||||
.nox,
|
.nox,
|
||||||
|
@ -24,10 +20,10 @@ exclude =
|
||||||
_vendor,
|
_vendor,
|
||||||
data
|
data
|
||||||
enable-extensions = G
|
enable-extensions = G
|
||||||
ignore =
|
extend-ignore =
|
||||||
G200, G202,
|
G200, G202,
|
||||||
# pycodestyle checks ignored in the default configuration
|
# black adds spaces around ':'
|
||||||
E121, E123, E126, E133, E226, E241, E242, E704, W503, W504, W505,
|
E203,
|
||||||
per-file-ignores =
|
per-file-ignores =
|
||||||
# G: The plugin logging-format treats every .log and .error as logging.
|
# G: The plugin logging-format treats every .log and .error as logging.
|
||||||
noxfile.py: G
|
noxfile.py: G
|
||||||
|
|
|
@ -2,7 +2,7 @@ import pip._internal.utils.inject_securetransport # noqa
|
||||||
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
|
|
||||||
if MYPY_CHECK_RUNNING:
|
if MYPY_CHECK_RUNNING:
|
||||||
from typing import Optional, List
|
from typing import List, Optional
|
||||||
|
|
||||||
|
|
||||||
def main(args=None):
|
def main(args=None):
|
||||||
|
|
|
@ -19,7 +19,8 @@ from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
|
|
||||||
if MYPY_CHECK_RUNNING:
|
if MYPY_CHECK_RUNNING:
|
||||||
from types import TracebackType
|
from types import TracebackType
|
||||||
from typing import Tuple, Set, Iterable, Optional, List, Type
|
from typing import Iterable, List, Optional, Set, Tuple, Type
|
||||||
|
|
||||||
from pip._internal.index.package_finder import PackageFinder
|
from pip._internal.index.package_finder import PackageFinder
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
|
@ -17,7 +17,7 @@ from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
from pip._internal.utils.urls import path_to_url
|
from pip._internal.utils.urls import path_to_url
|
||||||
|
|
||||||
if MYPY_CHECK_RUNNING:
|
if MYPY_CHECK_RUNNING:
|
||||||
from typing import Optional, Set, List, Any, Dict
|
from typing import Any, Dict, List, Optional, Set
|
||||||
|
|
||||||
from pip._vendor.packaging.tags import Tag
|
from pip._vendor.packaging.tags import Tag
|
||||||
|
|
||||||
|
|
|
@ -12,10 +12,7 @@ import traceback
|
||||||
|
|
||||||
from pip._internal.cli import cmdoptions
|
from pip._internal.cli import cmdoptions
|
||||||
from pip._internal.cli.command_context import CommandContextMixIn
|
from pip._internal.cli.command_context import CommandContextMixIn
|
||||||
from pip._internal.cli.parser import (
|
from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
|
||||||
ConfigOptionParser,
|
|
||||||
UpdatingDefaultsHelpFormatter,
|
|
||||||
)
|
|
||||||
from pip._internal.cli.status_codes import (
|
from pip._internal.cli.status_codes import (
|
||||||
ERROR,
|
ERROR,
|
||||||
PREVIOUS_BUILD_DIR_ERROR,
|
PREVIOUS_BUILD_DIR_ERROR,
|
||||||
|
@ -35,19 +32,16 @@ from pip._internal.utils.deprecation import deprecated
|
||||||
from pip._internal.utils.filesystem import check_path_owner
|
from pip._internal.utils.filesystem import check_path_owner
|
||||||
from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging
|
from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging
|
||||||
from pip._internal.utils.misc import get_prog, normalize_path
|
from pip._internal.utils.misc import get_prog, normalize_path
|
||||||
from pip._internal.utils.temp_dir import (
|
from pip._internal.utils.temp_dir import global_tempdir_manager, tempdir_registry
|
||||||
global_tempdir_manager,
|
|
||||||
tempdir_registry,
|
|
||||||
)
|
|
||||||
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
from pip._internal.utils.virtualenv import running_under_virtualenv
|
from pip._internal.utils.virtualenv import running_under_virtualenv
|
||||||
|
|
||||||
if MYPY_CHECK_RUNNING:
|
if MYPY_CHECK_RUNNING:
|
||||||
from typing import List, Optional, Tuple, Any
|
|
||||||
from optparse import Values
|
from optparse import Values
|
||||||
|
from typing import Any, List, Optional, Tuple
|
||||||
|
|
||||||
from pip._internal.utils.temp_dir import (
|
from pip._internal.utils.temp_dir import (
|
||||||
TempDirectoryTypeRegistry as TempDirRegistry
|
TempDirectoryTypeRegistry as TempDirRegistry,
|
||||||
)
|
)
|
||||||
|
|
||||||
__all__ = ['Command']
|
__all__ = ['Command']
|
||||||
|
|
|
@ -30,8 +30,9 @@ from pip._internal.utils.hashes import STRONG_HASHES
|
||||||
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
|
|
||||||
if MYPY_CHECK_RUNNING:
|
if MYPY_CHECK_RUNNING:
|
||||||
from typing import Any, Callable, Dict, Optional, Tuple
|
|
||||||
from optparse import OptionParser, Values
|
from optparse import OptionParser, Values
|
||||||
|
from typing import Any, Callable, Dict, Optional, Tuple
|
||||||
|
|
||||||
from pip._internal.cli.parser import ConfigOptionParser
|
from pip._internal.cli.parser import ConfigOptionParser
|
||||||
|
|
||||||
|
|
||||||
|
@ -187,7 +188,7 @@ no_color = partial(
|
||||||
dest='no_color',
|
dest='no_color',
|
||||||
action='store_true',
|
action='store_true',
|
||||||
default=False,
|
default=False,
|
||||||
help="Suppress colored output",
|
help="Suppress colored output.",
|
||||||
) # type: Callable[..., Option]
|
) # type: Callable[..., Option]
|
||||||
|
|
||||||
version = partial(
|
version = partial(
|
||||||
|
|
|
@ -5,7 +5,7 @@ from pip._vendor.contextlib2 import ExitStack
|
||||||
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
|
|
||||||
if MYPY_CHECK_RUNNING:
|
if MYPY_CHECK_RUNNING:
|
||||||
from typing import Iterator, ContextManager, TypeVar
|
from typing import ContextManager, Iterator, TypeVar
|
||||||
|
|
||||||
_T = TypeVar('_T', covariant=True)
|
_T = TypeVar('_T', covariant=True)
|
||||||
|
|
||||||
|
|
|
@ -5,17 +5,14 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from pip._internal.cli import cmdoptions
|
from pip._internal.cli import cmdoptions
|
||||||
from pip._internal.cli.parser import (
|
from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
|
||||||
ConfigOptionParser,
|
|
||||||
UpdatingDefaultsHelpFormatter,
|
|
||||||
)
|
|
||||||
from pip._internal.commands import commands_dict, get_similar_commands
|
from pip._internal.commands import commands_dict, get_similar_commands
|
||||||
from pip._internal.exceptions import CommandError
|
from pip._internal.exceptions import CommandError
|
||||||
from pip._internal.utils.misc import get_pip_version, get_prog
|
from pip._internal.utils.misc import get_pip_version, get_prog
|
||||||
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
|
|
||||||
if MYPY_CHECK_RUNNING:
|
if MYPY_CHECK_RUNNING:
|
||||||
from typing import Tuple, List
|
from typing import List, Tuple
|
||||||
|
|
||||||
|
|
||||||
__all__ = ["create_main_parser", "parse_command"]
|
__all__ = ["create_main_parser", "parse_command"]
|
||||||
|
|
|
@ -11,6 +11,7 @@ import sys
|
||||||
import textwrap
|
import textwrap
|
||||||
from distutils.util import strtobool
|
from distutils.util import strtobool
|
||||||
|
|
||||||
|
from pip._vendor.contextlib2 import suppress
|
||||||
from pip._vendor.six import string_types
|
from pip._vendor.six import string_types
|
||||||
|
|
||||||
from pip._internal.cli.status_codes import UNKNOWN_ERROR
|
from pip._internal.cli.status_codes import UNKNOWN_ERROR
|
||||||
|
@ -197,15 +198,27 @@ class ConfigOptionParser(CustomOptionParser):
|
||||||
if option is None:
|
if option is None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if option.action in ('store_true', 'store_false', 'count'):
|
if option.action in ('store_true', 'store_false'):
|
||||||
try:
|
try:
|
||||||
val = strtobool(val)
|
val = strtobool(val)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
error_msg = invalid_config_error_message(
|
self.error(
|
||||||
option.action, key, val
|
'{} is not a valid value for {} option, ' # noqa
|
||||||
|
'please specify a boolean value like yes/no, '
|
||||||
|
'true/false or 1/0 instead.'.format(val, key)
|
||||||
|
)
|
||||||
|
elif option.action == 'count':
|
||||||
|
with suppress(ValueError):
|
||||||
|
val = strtobool(val)
|
||||||
|
with suppress(ValueError):
|
||||||
|
val = int(val)
|
||||||
|
if not isinstance(val, int) or val < 0:
|
||||||
|
self.error(
|
||||||
|
'{} is not a valid value for {} option, ' # noqa
|
||||||
|
'please instead specify either a non-negative integer '
|
||||||
|
'or a boolean value like yes/no or false/true '
|
||||||
|
'which is equivalent to 1/0.'.format(val, key)
|
||||||
)
|
)
|
||||||
self.error(error_msg)
|
|
||||||
|
|
||||||
elif option.action == 'append':
|
elif option.action == 'append':
|
||||||
val = val.split()
|
val = val.split()
|
||||||
val = [self.check_default(option, key, v) for v in val]
|
val = [self.check_default(option, key, v) for v in val]
|
||||||
|
@ -251,16 +264,3 @@ class ConfigOptionParser(CustomOptionParser):
|
||||||
def error(self, msg):
|
def error(self, msg):
|
||||||
self.print_usage(sys.stderr)
|
self.print_usage(sys.stderr)
|
||||||
self.exit(UNKNOWN_ERROR, "{}\n".format(msg))
|
self.exit(UNKNOWN_ERROR, "{}\n".format(msg))
|
||||||
|
|
||||||
|
|
||||||
def invalid_config_error_message(action, key, val):
|
|
||||||
"""Returns a better error message when invalid configuration option
|
|
||||||
is provided."""
|
|
||||||
if action in ('store_true', 'store_false'):
|
|
||||||
return ("{0} is not a valid value for {1} option, "
|
|
||||||
"please specify a boolean value like yes/no, "
|
|
||||||
"true/false or 1/0 instead.").format(val, key)
|
|
||||||
|
|
||||||
return ("{0} is not a valid value for {1} option, "
|
|
||||||
"please specify a numerical value like 1/0 "
|
|
||||||
"instead.").format(val, key)
|
|
||||||
|
|
|
@ -16,7 +16,6 @@ from pip._internal.exceptions import CommandError, PreviousBuildDirError
|
||||||
from pip._internal.index.collector import LinkCollector
|
from pip._internal.index.collector import LinkCollector
|
||||||
from pip._internal.index.package_finder import PackageFinder
|
from pip._internal.index.package_finder import PackageFinder
|
||||||
from pip._internal.models.selection_prefs import SelectionPreferences
|
from pip._internal.models.selection_prefs import SelectionPreferences
|
||||||
from pip._internal.network.download import Downloader
|
|
||||||
from pip._internal.network.session import PipSession
|
from pip._internal.network.session import PipSession
|
||||||
from pip._internal.operations.prepare import RequirementPreparer
|
from pip._internal.operations.prepare import RequirementPreparer
|
||||||
from pip._internal.req.constructors import (
|
from pip._internal.req.constructors import (
|
||||||
|
@ -39,10 +38,7 @@ if MYPY_CHECK_RUNNING:
|
||||||
from pip._internal.req.req_install import InstallRequirement
|
from pip._internal.req.req_install import InstallRequirement
|
||||||
from pip._internal.req.req_tracker import RequirementTracker
|
from pip._internal.req.req_tracker import RequirementTracker
|
||||||
from pip._internal.resolution.base import BaseResolver
|
from pip._internal.resolution.base import BaseResolver
|
||||||
from pip._internal.utils.temp_dir import (
|
from pip._internal.utils.temp_dir import TempDirectory, TempDirectoryTypeRegistry
|
||||||
TempDirectory,
|
|
||||||
TempDirectoryTypeRegistry,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
@ -207,28 +203,39 @@ class RequirementCommand(IndexGroupCommand):
|
||||||
finder, # type: PackageFinder
|
finder, # type: PackageFinder
|
||||||
use_user_site, # type: bool
|
use_user_site, # type: bool
|
||||||
download_dir=None, # type: str
|
download_dir=None, # type: str
|
||||||
wheel_download_dir=None, # type: str
|
|
||||||
):
|
):
|
||||||
# type: (...) -> RequirementPreparer
|
# type: (...) -> RequirementPreparer
|
||||||
"""
|
"""
|
||||||
Create a RequirementPreparer instance for the given parameters.
|
Create a RequirementPreparer instance for the given parameters.
|
||||||
"""
|
"""
|
||||||
downloader = Downloader(session, progress_bar=options.progress_bar)
|
|
||||||
|
|
||||||
temp_build_dir_path = temp_build_dir.path
|
temp_build_dir_path = temp_build_dir.path
|
||||||
assert temp_build_dir_path is not None
|
assert temp_build_dir_path is not None
|
||||||
|
|
||||||
|
if '2020-resolver' in options.features_enabled:
|
||||||
|
lazy_wheel = 'fast-deps' in options.features_enabled
|
||||||
|
if lazy_wheel:
|
||||||
|
logger.warning(
|
||||||
|
'pip is using lazily downloaded wheels using HTTP '
|
||||||
|
'range requests to obtain dependency information. '
|
||||||
|
'This experimental feature is enabled through '
|
||||||
|
'--use-feature=fast-deps and it is not ready for '
|
||||||
|
'production.'
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
lazy_wheel = False
|
||||||
|
|
||||||
return RequirementPreparer(
|
return RequirementPreparer(
|
||||||
build_dir=temp_build_dir_path,
|
build_dir=temp_build_dir_path,
|
||||||
src_dir=options.src_dir,
|
src_dir=options.src_dir,
|
||||||
download_dir=download_dir,
|
download_dir=download_dir,
|
||||||
wheel_download_dir=wheel_download_dir,
|
|
||||||
build_isolation=options.build_isolation,
|
build_isolation=options.build_isolation,
|
||||||
req_tracker=req_tracker,
|
req_tracker=req_tracker,
|
||||||
downloader=downloader,
|
session=session,
|
||||||
|
progress_bar=options.progress_bar,
|
||||||
finder=finder,
|
finder=finder,
|
||||||
require_hashes=options.require_hashes,
|
require_hashes=options.require_hashes,
|
||||||
use_user_site=use_user_site,
|
use_user_site=use_user_site,
|
||||||
|
lazy_wheel=lazy_wheel,
|
||||||
)
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -259,6 +266,7 @@ class RequirementCommand(IndexGroupCommand):
|
||||||
# "Resolver" class being redefined.
|
# "Resolver" class being redefined.
|
||||||
if '2020-resolver' in options.features_enabled:
|
if '2020-resolver' in options.features_enabled:
|
||||||
import pip._internal.resolution.resolvelib.resolver
|
import pip._internal.resolution.resolvelib.resolver
|
||||||
|
|
||||||
return pip._internal.resolution.resolvelib.resolver.Resolver(
|
return pip._internal.resolution.resolvelib.resolver.Resolver(
|
||||||
preparer=preparer,
|
preparer=preparer,
|
||||||
finder=finder,
|
finder=finder,
|
||||||
|
@ -271,7 +279,6 @@ class RequirementCommand(IndexGroupCommand):
|
||||||
force_reinstall=force_reinstall,
|
force_reinstall=force_reinstall,
|
||||||
upgrade_strategy=upgrade_strategy,
|
upgrade_strategy=upgrade_strategy,
|
||||||
py_version_info=py_version_info,
|
py_version_info=py_version_info,
|
||||||
lazy_wheel='fast-deps' in options.features_enabled,
|
|
||||||
)
|
)
|
||||||
import pip._internal.resolution.legacy.resolver
|
import pip._internal.resolution.legacy.resolver
|
||||||
return pip._internal.resolution.legacy.resolver.Resolver(
|
return pip._internal.resolution.legacy.resolver.Resolver(
|
||||||
|
|
|
@ -13,7 +13,7 @@ from pip._internal.utils.logging import get_indentation
|
||||||
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
|
|
||||||
if MYPY_CHECK_RUNNING:
|
if MYPY_CHECK_RUNNING:
|
||||||
from typing import Iterator, IO
|
from typing import IO, Iterator
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
|
|
||||||
if MYPY_CHECK_RUNNING:
|
if MYPY_CHECK_RUNNING:
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from pip._internal.cli.base_command import Command
|
from pip._internal.cli.base_command import Command
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -37,11 +37,25 @@ class CacheCommand(Command):
|
||||||
usage = """
|
usage = """
|
||||||
%prog dir
|
%prog dir
|
||||||
%prog info
|
%prog info
|
||||||
%prog list [<pattern>]
|
%prog list [<pattern>] [--format=[human, abspath]]
|
||||||
%prog remove <pattern>
|
%prog remove <pattern>
|
||||||
%prog purge
|
%prog purge
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
def add_options(self):
|
||||||
|
# type: () -> None
|
||||||
|
|
||||||
|
self.cmd_opts.add_option(
|
||||||
|
'--format',
|
||||||
|
action='store',
|
||||||
|
dest='list_format',
|
||||||
|
default="human",
|
||||||
|
choices=('human', 'abspath'),
|
||||||
|
help="Select the output format among: human (default) or abspath"
|
||||||
|
)
|
||||||
|
|
||||||
|
self.parser.insert_option_group(0, self.cmd_opts)
|
||||||
|
|
||||||
def run(self, options, args):
|
def run(self, options, args):
|
||||||
# type: (Values, List[Any]) -> int
|
# type: (Values, List[Any]) -> int
|
||||||
handlers = {
|
handlers = {
|
||||||
|
@ -88,19 +102,30 @@ class CacheCommand(Command):
|
||||||
if args:
|
if args:
|
||||||
raise CommandError('Too many arguments')
|
raise CommandError('Too many arguments')
|
||||||
|
|
||||||
|
num_http_files = len(self._find_http_files(options))
|
||||||
num_packages = len(self._find_wheels(options, '*'))
|
num_packages = len(self._find_wheels(options, '*'))
|
||||||
|
|
||||||
cache_location = self._wheels_cache_dir(options)
|
http_cache_location = self._cache_dir(options, 'http')
|
||||||
cache_size = filesystem.format_directory_size(cache_location)
|
wheels_cache_location = self._cache_dir(options, 'wheels')
|
||||||
|
http_cache_size = filesystem.format_directory_size(http_cache_location)
|
||||||
|
wheels_cache_size = filesystem.format_directory_size(
|
||||||
|
wheels_cache_location
|
||||||
|
)
|
||||||
|
|
||||||
message = textwrap.dedent("""
|
message = textwrap.dedent("""
|
||||||
Location: {location}
|
Package index page cache location: {http_cache_location}
|
||||||
Size: {size}
|
Package index page cache size: {http_cache_size}
|
||||||
|
Number of HTTP files: {num_http_files}
|
||||||
|
Wheels location: {wheels_cache_location}
|
||||||
|
Wheels size: {wheels_cache_size}
|
||||||
Number of wheels: {package_count}
|
Number of wheels: {package_count}
|
||||||
""").format(
|
""").format(
|
||||||
location=cache_location,
|
http_cache_location=http_cache_location,
|
||||||
|
http_cache_size=http_cache_size,
|
||||||
|
num_http_files=num_http_files,
|
||||||
|
wheels_cache_location=wheels_cache_location,
|
||||||
package_count=num_packages,
|
package_count=num_packages,
|
||||||
size=cache_size,
|
wheels_cache_size=wheels_cache_size,
|
||||||
).strip()
|
).strip()
|
||||||
|
|
||||||
logger.info(message)
|
logger.info(message)
|
||||||
|
@ -116,7 +141,13 @@ class CacheCommand(Command):
|
||||||
pattern = '*'
|
pattern = '*'
|
||||||
|
|
||||||
files = self._find_wheels(options, pattern)
|
files = self._find_wheels(options, pattern)
|
||||||
|
if options.list_format == 'human':
|
||||||
|
self.format_for_human(files)
|
||||||
|
else:
|
||||||
|
self.format_for_abspath(files)
|
||||||
|
|
||||||
|
def format_for_human(self, files):
|
||||||
|
# type: (List[str]) -> None
|
||||||
if not files:
|
if not files:
|
||||||
logger.info('Nothing cached.')
|
logger.info('Nothing cached.')
|
||||||
return
|
return
|
||||||
|
@ -129,6 +160,17 @@ class CacheCommand(Command):
|
||||||
logger.info('Cache contents:\n')
|
logger.info('Cache contents:\n')
|
||||||
logger.info('\n'.join(sorted(results)))
|
logger.info('\n'.join(sorted(results)))
|
||||||
|
|
||||||
|
def format_for_abspath(self, files):
|
||||||
|
# type: (List[str]) -> None
|
||||||
|
if not files:
|
||||||
|
return
|
||||||
|
|
||||||
|
results = []
|
||||||
|
for filename in files:
|
||||||
|
results.append(filename)
|
||||||
|
|
||||||
|
logger.info('\n'.join(sorted(results)))
|
||||||
|
|
||||||
def remove_cache_items(self, options, args):
|
def remove_cache_items(self, options, args):
|
||||||
# type: (Values, List[Any]) -> None
|
# type: (Values, List[Any]) -> None
|
||||||
if len(args) > 1:
|
if len(args) > 1:
|
||||||
|
@ -138,6 +180,11 @@ class CacheCommand(Command):
|
||||||
raise CommandError('Please provide a pattern')
|
raise CommandError('Please provide a pattern')
|
||||||
|
|
||||||
files = self._find_wheels(options, args[0])
|
files = self._find_wheels(options, args[0])
|
||||||
|
|
||||||
|
# Only fetch http files if no specific pattern given
|
||||||
|
if args[0] == '*':
|
||||||
|
files += self._find_http_files(options)
|
||||||
|
|
||||||
if not files:
|
if not files:
|
||||||
raise CommandError('No matching packages')
|
raise CommandError('No matching packages')
|
||||||
|
|
||||||
|
@ -153,13 +200,18 @@ class CacheCommand(Command):
|
||||||
|
|
||||||
return self.remove_cache_items(options, ['*'])
|
return self.remove_cache_items(options, ['*'])
|
||||||
|
|
||||||
def _wheels_cache_dir(self, options):
|
def _cache_dir(self, options, subdir):
|
||||||
# type: (Values) -> str
|
# type: (Values, str) -> str
|
||||||
return os.path.join(options.cache_dir, 'wheels')
|
return os.path.join(options.cache_dir, subdir)
|
||||||
|
|
||||||
|
def _find_http_files(self, options):
|
||||||
|
# type: (Values) -> List[str]
|
||||||
|
http_dir = self._cache_dir(options, 'http')
|
||||||
|
return filesystem.find_files(http_dir, '*')
|
||||||
|
|
||||||
def _find_wheels(self, options, pattern):
|
def _find_wheels(self, options, pattern):
|
||||||
# type: (Values, str) -> List[str]
|
# type: (Values, str) -> List[str]
|
||||||
wheel_dir = self._wheels_cache_dir(options)
|
wheel_dir = self._cache_dir(options, 'wheels')
|
||||||
|
|
||||||
# The wheel filename format, as specified in PEP 427, is:
|
# The wheel filename format, as specified in PEP 427, is:
|
||||||
# {distribution}-{version}(-{build})?-{python}-{abi}-{platform}.whl
|
# {distribution}-{version}(-{build})?-{python}-{abi}-{platform}.whl
|
||||||
|
|
|
@ -12,8 +12,8 @@ from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
if MYPY_CHECK_RUNNING:
|
if MYPY_CHECK_RUNNING:
|
||||||
from typing import List, Any
|
|
||||||
from optparse import Values
|
from optparse import Values
|
||||||
|
from typing import Any, List
|
||||||
|
|
||||||
|
|
||||||
class CheckCommand(Command):
|
class CheckCommand(Command):
|
||||||
|
|
|
@ -9,8 +9,8 @@ from pip._internal.utils.misc import get_prog
|
||||||
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
|
|
||||||
if MYPY_CHECK_RUNNING:
|
if MYPY_CHECK_RUNNING:
|
||||||
from typing import List
|
|
||||||
from optparse import Values
|
from optparse import Values
|
||||||
|
from typing import List
|
||||||
|
|
||||||
BASE_COMPLETION = """
|
BASE_COMPLETION = """
|
||||||
# pip {shell} completion start{script}# pip {shell} completion end
|
# pip {shell} completion start{script}# pip {shell} completion end
|
||||||
|
|
|
@ -4,19 +4,15 @@ import subprocess
|
||||||
|
|
||||||
from pip._internal.cli.base_command import Command
|
from pip._internal.cli.base_command import Command
|
||||||
from pip._internal.cli.status_codes import ERROR, SUCCESS
|
from pip._internal.cli.status_codes import ERROR, SUCCESS
|
||||||
from pip._internal.configuration import (
|
from pip._internal.configuration import Configuration, get_configuration_files, kinds
|
||||||
Configuration,
|
|
||||||
get_configuration_files,
|
|
||||||
kinds,
|
|
||||||
)
|
|
||||||
from pip._internal.exceptions import PipError
|
from pip._internal.exceptions import PipError
|
||||||
from pip._internal.utils.logging import indent_log
|
from pip._internal.utils.logging import indent_log
|
||||||
from pip._internal.utils.misc import get_prog, write_output
|
from pip._internal.utils.misc import get_prog, write_output
|
||||||
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
|
|
||||||
if MYPY_CHECK_RUNNING:
|
if MYPY_CHECK_RUNNING:
|
||||||
from typing import List, Any, Optional
|
|
||||||
from optparse import Values
|
from optparse import Values
|
||||||
|
from typing import Any, List, Optional
|
||||||
|
|
||||||
from pip._internal.configuration import Kind
|
from pip._internal.configuration import Kind
|
||||||
|
|
||||||
|
|
|
@ -19,9 +19,10 @@ from pip._internal.utils.misc import get_pip_version
|
||||||
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
|
|
||||||
if MYPY_CHECK_RUNNING:
|
if MYPY_CHECK_RUNNING:
|
||||||
from types import ModuleType
|
|
||||||
from typing import List, Optional, Dict
|
|
||||||
from optparse import Values
|
from optparse import Values
|
||||||
|
from types import ModuleType
|
||||||
|
from typing import Dict, List, Optional
|
||||||
|
|
||||||
from pip._internal.configuration import Configuration
|
from pip._internal.configuration import Configuration
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
|
@ -87,7 +87,6 @@ class DownloadCommand(RequirementCommand):
|
||||||
cmdoptions.check_dist_restriction(options)
|
cmdoptions.check_dist_restriction(options)
|
||||||
|
|
||||||
options.download_dir = normalize_path(options.download_dir)
|
options.download_dir = normalize_path(options.download_dir)
|
||||||
|
|
||||||
ensure_dir(options.download_dir)
|
ensure_dir(options.download_dir)
|
||||||
|
|
||||||
session = self.get_default_session(options)
|
session = self.get_default_session(options)
|
||||||
|
@ -134,10 +133,13 @@ class DownloadCommand(RequirementCommand):
|
||||||
reqs, check_supported_wheels=True
|
reqs, check_supported_wheels=True
|
||||||
)
|
)
|
||||||
|
|
||||||
downloaded = ' '.join([req.name # type: ignore
|
downloaded = [] # type: List[str]
|
||||||
for req in requirement_set.requirements.values()
|
for req in requirement_set.requirements.values():
|
||||||
if req.successfully_downloaded])
|
if not req.editable and req.satisfied_by is None:
|
||||||
|
assert req.name is not None
|
||||||
|
preparer.save_linked_requirement(req)
|
||||||
|
downloaded.append(req.name)
|
||||||
if downloaded:
|
if downloaded:
|
||||||
write_output('Successfully downloaded %s', downloaded)
|
write_output('Successfully downloaded %s', ' '.join(downloaded))
|
||||||
|
|
||||||
return SUCCESS
|
return SUCCESS
|
||||||
|
|
|
@ -6,8 +6,8 @@ from pip._internal.exceptions import CommandError
|
||||||
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
|
|
||||||
if MYPY_CHECK_RUNNING:
|
if MYPY_CHECK_RUNNING:
|
||||||
from typing import List
|
|
||||||
from optparse import Values
|
from optparse import Values
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
|
||||||
class HelpCommand(Command):
|
class HelpCommand(Command):
|
||||||
|
@ -20,7 +20,9 @@ class HelpCommand(Command):
|
||||||
def run(self, options, args):
|
def run(self, options, args):
|
||||||
# type: (Values, List[str]) -> int
|
# type: (Values, List[str]) -> int
|
||||||
from pip._internal.commands import (
|
from pip._internal.commands import (
|
||||||
commands_dict, create_command, get_similar_commands,
|
commands_dict,
|
||||||
|
create_command,
|
||||||
|
get_similar_commands,
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -21,7 +21,6 @@ from pip._internal.locations import distutils_scheme
|
||||||
from pip._internal.operations.check import check_install_conflicts
|
from pip._internal.operations.check import check_install_conflicts
|
||||||
from pip._internal.req import install_given_reqs
|
from pip._internal.req import install_given_reqs
|
||||||
from pip._internal.req.req_tracker import get_requirement_tracker
|
from pip._internal.req.req_tracker import get_requirement_tracker
|
||||||
from pip._internal.utils.datetime import today_is_later_than
|
|
||||||
from pip._internal.utils.distutils_args import parse_distutils_args
|
from pip._internal.utils.distutils_args import parse_distutils_args
|
||||||
from pip._internal.utils.filesystem import test_writable_dir
|
from pip._internal.utils.filesystem import test_writable_dir
|
||||||
from pip._internal.utils.misc import (
|
from pip._internal.utils.misc import (
|
||||||
|
@ -543,19 +542,6 @@ class InstallCommand(RequirementCommand):
|
||||||
"your packages with the new resolver before it becomes the "
|
"your packages with the new resolver before it becomes the "
|
||||||
"default.\n"
|
"default.\n"
|
||||||
)
|
)
|
||||||
elif not today_is_later_than(year=2020, month=7, day=31):
|
|
||||||
# NOTE: trailing newlines here are intentional
|
|
||||||
parts.append(
|
|
||||||
"Pip will install or upgrade your package(s) and its "
|
|
||||||
"dependencies without taking into account other packages you "
|
|
||||||
"already have installed. This may cause an uncaught "
|
|
||||||
"dependency conflict.\n"
|
|
||||||
)
|
|
||||||
form_link = "https://forms.gle/cWKMoDs8sUVE29hz9"
|
|
||||||
parts.append(
|
|
||||||
"If you would like pip to take your other packages into "
|
|
||||||
"account, please tell us here: {}\n".format(form_link)
|
|
||||||
)
|
|
||||||
|
|
||||||
# NOTE: There is some duplication here, with commands/check.py
|
# NOTE: There is some duplication here, with commands/check.py
|
||||||
for project_name in missing:
|
for project_name in missing:
|
||||||
|
|
|
@ -24,10 +24,11 @@ from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
|
|
||||||
if MYPY_CHECK_RUNNING:
|
if MYPY_CHECK_RUNNING:
|
||||||
from optparse import Values
|
from optparse import Values
|
||||||
from typing import List, Set, Tuple, Iterator
|
from typing import Iterator, List, Set, Tuple
|
||||||
|
|
||||||
|
from pip._vendor.pkg_resources import Distribution
|
||||||
|
|
||||||
from pip._internal.network.session import PipSession
|
from pip._internal.network.session import PipSession
|
||||||
from pip._vendor.pkg_resources import Distribution
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -201,7 +202,6 @@ class ListCommand(IndexGroupCommand):
|
||||||
|
|
||||||
def latest_info(dist):
|
def latest_info(dist):
|
||||||
# type: (Distribution) -> Distribution
|
# type: (Distribution) -> Distribution
|
||||||
typ = 'unknown'
|
|
||||||
all_candidates = finder.find_all_candidates(dist.key)
|
all_candidates = finder.find_all_candidates(dist.key)
|
||||||
if not options.pre:
|
if not options.pre:
|
||||||
# Remove prereleases
|
# Remove prereleases
|
||||||
|
|
|
@ -7,6 +7,7 @@ from collections import OrderedDict
|
||||||
|
|
||||||
from pip._vendor import pkg_resources
|
from pip._vendor import pkg_resources
|
||||||
from pip._vendor.packaging.version import parse as parse_version
|
from pip._vendor.packaging.version import parse as parse_version
|
||||||
|
|
||||||
# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is
|
# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is
|
||||||
# why we ignore the type on this import
|
# why we ignore the type on this import
|
||||||
from pip._vendor.six.moves import xmlrpc_client # type: ignore
|
from pip._vendor.six.moves import xmlrpc_client # type: ignore
|
||||||
|
@ -24,7 +25,8 @@ from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
|
|
||||||
if MYPY_CHECK_RUNNING:
|
if MYPY_CHECK_RUNNING:
|
||||||
from optparse import Values
|
from optparse import Values
|
||||||
from typing import List, Dict, Optional
|
from typing import Dict, List, Optional
|
||||||
|
|
||||||
from typing_extensions import TypedDict
|
from typing_extensions import TypedDict
|
||||||
TransformedHit = TypedDict(
|
TransformedHit = TypedDict(
|
||||||
'TransformedHit',
|
'TransformedHit',
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue