Установка пакетов Python из локальной папки файловой системы в virtualenv с помощью pip

Можно ли устанавливать пакеты с помощью 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.

Ответ 1

Я уверен, что то, что вы ищете, называется --find-links.

Хотя вам может понадобиться создать фиктивный index.html для вашего локального индекса пакета, в котором перечислены ссылки на все пакеты. Этот инструмент помогает:

https://github.com/wolever/pip2pi

Ответ 2

Как насчет:

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".

Ответ 3

Это очень просто. Необходимая команда:

pip install -e <DIRECTORY>

Обратите внимание, что каталог должен содержать файл setup.py

Ответ 4

Я устанавливаю 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.

Надеюсь, это может вам помочь.

Ответ 5

Это решение, в результате которого я использовал:

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

Ответ 6

Вариант --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, чтобы узнать, как разделить требования и использовать организацию требований на основе папок.

Ответ 7

Предполагая, что вы 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

Ответ 8

Имея потребности в requirements.txt и egg_dir как каталог

Вы можете создать свой локальный кеш:

$ pip download -r requirements.txt -d eggs_dir

затем, используя этот "кеш" просто:

$ pip install -r requirements.txt --find-links=eggs_dir

Ответ 9

"Список пипсов" просто волшебен!

Ответ 10

На странице установочных пакетов вы можете просто запустить:

pip install/srv/pkg/mypackage

где /srv/pkg/mypackage - это каталог, содержащий setup.py.


Дополнительно 1 вы можете установить его из файла архива:

pip install./mypackage-1.0.4.tar.gz

1 Хотя отмечается в вопросе, из-за его популярности, он также включен.

Ответ 11

Я пытался достичь чего-то действительно простого и с треском провалился, возможно, я глупый.

В любом случае, если у вас есть скрипт /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 перед установкой.

Я, вероятно, делал что-то очень глупое, но в конце концов я сдался и выбрал это. Я надеюсь, что это помогает другим, пытающимся сделать что-то подобное.