Ответ 1
Я уверен, что то, что вы ищете, называется --find-links
.
Хотя вам может понадобиться создать фиктивный index.html
для вашего локального индекса пакета, в котором перечислены ссылки на все пакеты. Этот инструмент помогает:
Можно ли устанавливать пакеты с помощью pip из локальной файловой системы?
Я выполнил python setup.py sdist
для моего пакета, который создал соответствующий файл tar.gz. Этот файл хранится в моей системе в /srv/pkg/mypackage/mypackage-0.1.0.tar.gz
.
Теперь в виртуальной среде я хотел бы установить пакеты либо из pypi, либо из определенного локального местоположения /srv/pkg
.
Возможно ли это?
PS
Я знаю, что могу указать pip install /srv/pkg/mypackage/mypackage-0.1.0.tar.gz
. Это будет работать, но я говорю об использовании местоположения /srv/pkg
в качестве другого места для поиска по пунктам, если я набрал pip install mypackage
.
Я уверен, что то, что вы ищете, называется --find-links
.
Хотя вам может понадобиться создать фиктивный index.html
для вашего локального индекса пакета, в котором перечислены ссылки на все пакеты. Этот инструмент помогает:
Как насчет:
pip install --help
...
-e, --editable <path/url> Install a project in editable mode (i.e. setuptools
"develop mode") from a local project path or a VCS url.
например, pip install -e /srv/pkg
где/srv/pkg - это каталог верхнего уровня, где можно найти "setup.py".
Это очень просто. Необходимая команда:
pip install -e <DIRECTORY>
Обратите внимание, что каталог должен содержать файл setup.py
Я устанавливаю pyfuzzy
но это не в PyPI; он возвращает сообщение: No matching distribution found for pyfuzzy
.
Я попробовал принятый ответ
pip install --no-index --find-links=file:///Users/victor/Downloads/pyfuzzy-0.1.0 pyfuzzy
Но он не работает и возвращает следующую ошибку:
Игнорирование индексов: https://pypi.python.org/simple Сбор pyfuzzy Не удалось найти версию, которая удовлетворяет требованию pyfuzzy (из версий:) Не найдено подходящего распределения для pyfuzzy
Наконец, я нашел простой способ: https://pip.pypa.io/en/latest/reference/pip_install.html
Install a particular source archive file.
$ pip install ./downloads/SomePackage-1.0.4.tar.gz
$ pip install http://my.package.repo/SomePackage-1.0.4.zip
Поэтому для меня работала следующая команда:
pip install ../pyfuzzy-0.1.0.tar.gz.
Надеюсь, это может вам помочь.
Это решение, в результате которого я использовал:
import pip
def install(package):
# Debugging
# pip.main(["install", "--pre", "--upgrade", "--no-index",
# "--find-links=.", package, "--log-file", "log.txt", "-vv"])
pip.main(["install", "--upgrade", "--no-index", "--find-links=.", package])
if __name__ == "__main__":
install("mypackagename")
raw_input("Press Enter to Exit...\n")
Я собрал это вместе с примерами установки pip, а также из ответа Рикарда по другому вопросу. Аргумент "--pre" позволяет установить непродуктивные версии. Аргумент "-no-index" позволяет избежать поиска индексов PyPI. "--Find-links =." поиск аргументов в локальной папке (это может быть относительным или абсолютным). Я использовал аргументы "-log-file", "log.txt" и "-vv" для отладки. Параметр "--upgrade" позволяет устанавливать более старые версии по сравнению с более старыми.
Я также нашел хороший способ их удалить. Это полезно, если у вас несколько различных сред Python. Это тот же базовый формат, просто используя "удалить" вместо "install", с мерой безопасности для предотвращения непреднамеренных удалений:
import pip
def uninstall(package):
response = raw_input("Uninstall '%s'? [y/n]:\n" % package)
if "y" in response.lower():
# Debugging
# pip.main(["uninstall", package, "-vv"])
pip.main(["uninstall", package])
pass
if __name__ == "__main__":
uninstall("mypackagename")
raw_input("Press Enter to Exit...\n")
Локальная папка содержит эти файлы: install.py, uninstall.py, mypackagename-1.0.zip
Вариант --find-ссылки делает работу, и она работает с requirements.txt
файла!
Вы можете поместить архивы пакетов в какую-то папку и взять самую последнюю, не изменяя файл требований, например, requirements
:
.
└───requirements.txt
└───requirements
├───foo_bar-0.1.5-py2.py3-none-any.whl
├───foo_bar-0.1.6-py2.py3-none-any.whl
├───wiz_bang-0.7-py2.py3-none-any.whl
├───wiz_bang-0.8-py2.py3-none-any.whl
├───base.txt
├───local.txt
└───production.txt
Теперь в requirements/base.txt
положите:
--find-links=requirements
foo_bar
wiz_bang>=0.8
Удобный способ обновить проприетарные пакеты, просто поместите новый в папку
Таким образом, вы можете установить пакеты из local folder
AND pypi
и тем же вызовом: pip install -r requirements/production.txt
PS. См. Мою ветку cookiecutter-djangopackage, чтобы узнать, как разделить требования и использовать организацию требований на основе папок.
Предполагая, что вы virtualenv и requirements.txt
файл, то вы можете определить внутри этого файла, в котором для получения пакетов:
# Published pypi packages
PyJWT==1.6.4
email_validator==1.0.3
# Remote GIT repo package, this will install as django-bootstrap-themes
git+https://github.com/marquicus/django-bootstrap-themes#egg=django-bootstrap-themes
# Local GIT repo package, this will install as django-knowledge
git+file:///soft/SANDBOX/python/django/forks/django-knowledge#egg=django-knowledge
Имея потребности в requirements.txt
и egg_dir
как каталог
Вы можете создать свой локальный кеш:
$ pip download -r requirements.txt -d eggs_dir
затем, используя этот "кеш" просто:
$ pip install -r requirements.txt --find-links=eggs_dir
"Список пипсов" просто волшебен!
На странице установочных пакетов вы можете просто запустить:
pip install/srv/pkg/mypackage
где /srv/pkg/mypackage - это каталог, содержащий setup.py.
Дополнительно 1 вы можете установить его из файла архива:
pip install./mypackage-1.0.4.tar.gz
1 Хотя отмечается в вопросе, из-за его популярности, он также включен.
Я пытался достичь чего-то действительно простого и с треском провалился, возможно, я глупый.
В любом случае, если у вас есть скрипт /Dockerfile
который загружает zip файл пакета Python (например, из GitHub), а затем вы хотите установить его, вы можете использовать префикс file:///
чтобы установить его, как показано в следующем примере:
$ wget https://example.com/mypackage.zip
$ echo "${MYPACKAGE_MD5} mypackage.zip" | md5sum --check -
$ pip install file:///.mypackage.zip
ПРИМЕЧАНИЕ: я знаю, что вы можете установить пакет сразу, используя pip install https://example.com/mypackage.zip
но в моем случае я хотел проверить контрольную сумму (никогда не бывает достаточно параноидальной), и я с треском провалился при попытке использовать различные параметры, которые предоставляет pip/фрагмент #md5
.
Было удивительно сложно сделать что-то настолько простое напрямую с pip
. Я просто хотел пройти контрольную сумму и попросить pip
проверить, совпадает ли zip перед установкой.
Я, вероятно, делал что-то очень глупое, но в конце концов я сдался и выбрал это. Я надеюсь, что это помогает другим, пытающимся сделать что-то подобное.