Как установить пакеты из локального индекса пакетов python?

https://www.python.org/dev/peps/pep-0503 и https://pip.pypa.io/en/stable/reference/pip_wheel/#cmdoption-i намекают на возможность установки пакетов python из локального каталога, но не совсем ясно, как это выглядит на практике.

Использую ли я те же файлы index.html в своих локальных каталогах? Как выглядит аргумент --extra-index-url для локального каталога?


person Mike Bjorge    schedule 17.08.2017    source источник
comment
Чтобы уточнить, я хочу иметь возможность установить с помощью файла requirements.txt, например. pip install -r requirements.txt   -  person Mike Bjorge    schedule 18.08.2017


Ответы (3)


Если у вас есть каталог дистрибутивов, который вы хотите найти по pip, вы можете просто указать путь к каталогу:

pip install --extra-index-url=/path/to/wheelhouse somepackage

Вы можете использовать --index-url вместо --extra-index-url, если вы вообще не хотите искать удаленный PyPI. Обратите внимание, что также можно добавить --extra-index-url и/или --index-url в начало файла requirements.txt.

Используя pip, вы также можете установить дистрибутив прямо из локального файла. Например, чтобы установить дистрибутив copyingmock:

$ curl https://pypi.python.org/packages/d9/26/5ae8945356634c87cdf099bd7cee57799df46798af90ae5ccb03961c6359/copyingmock-0.1-py2.py3-none-any.whl > copyingmock-0.1-py2.py3-none-any.whl
$ pip install ./copyingmock-0.1-py2.py3-none-any.whl

Я показал пример с бинарным дистрибутивом, но то же самое должно работать и с исходными дистрибутивами (.tar.gz).

person wim    schedule 17.08.2017

Допустим, у вас есть 2 пакета, которые вы хотите установить локально: abc-xyz и foo, и у вас есть соответствующие файлы пакетов abc-xzy-1.2.3.tar.gz и foo-1.0.0.tar.gz.

Мы поместим ваш локальный каталог pypi в /my_local_pypi/simple

Ваша структура каталогов будет выглядеть так:

/my_local_pypi/simple
  index.html
  - abc-xyz/
     index.html     
     abc-xyz-1.2.3.tar.gz  
  - foo/
     index.html
     foo-1.0.0.tar.gz

Корню index.html требуется <a href></a> записей привязки для каждого пакета, поэтому он должен выглядеть так:

$ cat /my_local_pypi/simple/index.html
<!DOCTYPE html><html><body>
<a href="abc-xyz">abc-xyz></a></br>
<a href="foo">foo</a></br>
</body></html>

Затем каждому $package/index.html нужен якорь <a href></a>, указывающий на фактический файл пакета, поэтому они должны выглядеть так:

$ cat /my_local_pypi/simple/abc-xyz/index.html
<!DOCTYPE html><html><body>
<a href="abc-xyz-1.2.3.tar.gz">abc-xyz-1.2.3.tar.gz</a></br>
</body></html>

$ cat /my_local_pypi/simple/foo/index.html
<!DOCTYPE html><html><body>
<a href="foo-1.0.0.tar.gz">foo-1.0.0.tar.gz</a></br>
</body></html>

Затем в вашем requirements.txt вы можете сделать:

$ cat requirements.txt
--extra-index-url file:///my_local_pypi/simple/
abc-xyz==1.2.3
foo==1.0.0

И тогда вы должны быть готовы к работе: pip install -r requirements.txt

См. также проект piprepo, который неплохо справляется с созданием необходимой структуры локальных каталогов.

person Mike Bjorge    schedule 17.08.2017
comment
ты сам только что ответил на свой вопрос? - person mmenschig; 18.08.2017

Вам не нужно будет использовать какие-либо index.html файлы.

Запуска следующего должно быть достаточно:

pip install "path/to/file.whl"

Это будет установлено из локального файла колеса.

person mmenschig    schedule 17.08.2017
comment
Можете ли вы также использовать такие пути из файла requirements.txt? - person Mike Bjorge; 18.08.2017