Как сделать, чтобы pip рекурсивно искал каталоги для пакетов и зависимостей?

Способен ли pip рекурсивно искать путь к файловой системе и устанавливать пакет и его зависимости? Например, при следующей файловой структуре (файлы не показаны) pip install packageA -f C:\packages\ не работает.

C:\packages\
C:\packages\packageA\
C:\packages\packageA\1.0.0
C:\packages\packageA\1.0.1

C:\packages\packageB\
C:\packages\packageB\2.2.1
C:\packages\packageB\2.2.4

Кроме того, могут ли эти пакеты быть чистым исходным кодом с файлом setup.py? Или они должны быть двоичными, такими как колесо или zip-файлы. И, наконец, есть ли способ разрешить зависимости? Например, если для пакета A требуется версия пакета B, может ли pip получить эту версию пакета B из моих папок? Нужны ли мне html-файлы, указывающие, где и что находится?

Я знаю, что могу указать pip напрямую на локальные пути (pip install C:\packages\packageA\1.0.0), но я хочу, чтобы это работало так, как если бы пакеты были доступны в PyPI. Например, если пользователь вводит pip install packageB или pip install requirements.txt и этот файл требований содержит пакеты, которые существуют локально, но не в PyPI, он просто сработает. (Я мог бы указать путь к локальному хранилищу пакетов в файле конфигурации, чтобы команде pip не требовался аргумент -f)

По сути, я хочу воспроизвести функциональность PyPI, используя файловую систему без веб-сервера (безопасность не позволит нам запустить его). Мы будем очень признательны за любое понимание.


person supertommy    schedule 19.03.2018    source источник


Ответы (2)


Я понял это. Я использовал пакет под названием pip2pi. В этом пакете есть команда dir2pi. Я создаю каталог, содержащий файлы tar.gz. Каждый файл tar.gz представлял собой пакет Python, созданный с помощью этот макет. Чтобы обозначить версии, я добавил дефис, а затем использовал семантическое управление версиями.

Каталог выглядел так:

C:\packages\package_a-1.0.8.tar.gz
C:\packages\package_a-1.1.0.tar.gz
C:\packages\package_b-2.0.0.tar.gz
C:\packages\package_c-1.0.5.tar.gz

Потом я побежал, dir2pi C:\packages -S. Это создало необходимые файлы HTML и макет папки. В корне папки была создана папка с названием simple. Название simple похоже на PEP 503. Внутри simple структура папок выглядела так:

C:\packages\simple\index.html

C:\packages\simple\package_a
C:\packages\simple\package_a\index.html
C:\packages\simple\package_a\package_a-1.0.8.tar.gz
C:\packages\simple\package_a\package_a-1.1.1.tar.gz

C:\packages\simple\package_b
C:\packages\simple\package_b\index.html
C:\packages\simple\package_b\package_b-2.0.0.tar.gz

C:\packages\simple\package_c
C:\packages\simple\package_c\index.html
C:\packages\simple\package_c\package_c-1.0.5.tar.gz

По-видимому, именно так выглядит совместимый макет файла/папки для pip.

Каждый файл index.html содержит ссылки на соседние с ним файлы и папки. Например, C:\packages\simple\index.html выглядит так:

<html><head><title>Simple Index</title><meta name='api-version' value='2' /></head><body>
<a href='package_a/'>package_a</a><br />
<a href='package_b/'>package_b</a><br />
<a href='package_c/'>package_c</a><br />
</body></html>

C:\packages\simple\package_a\index.html выглядит так:

<a href='package_a-1.0.8.tar.gz'>package_a-1.0.8.tar.gz</a><br />
<a href='package_a-1.1.1.tar.gz'>package_a-1.1.1.tar.gz</a><br />

Теперь с правильными файлами HTML и структурой папок я сказал pip искать пакеты в папке C:\packages\simple. Я сделал это, отредактировав файл pip.ini (расположение варьируется от системы к системе) и добавив эту строку:

[global]
extra-index-url = file:///c:/packages/simple

В качестве альтернативы я мог бы также передать эту папку в pip в качестве параметра, например:

pip install --index-url=file:///c:/packages/simple package_a==1.1.1
person supertommy    schedule 20.03.2018

Способен ли pip рекурсивно искать…?

Нет. Либо один плоский каталог, либо предварительно сгенерированный html-файл, в котором перечислены файлы в подкаталогах.

Кроме того, могут ли эти пакеты быть чистым исходным кодом с файлом setup.py?

Да. pip может устанавливать исходные дистрибутивы, яйца и колеса.

И, наконец, есть ли способ разрешить зависимости?

Да, но они должны быть доступны. То есть сервер, подобный PyPI (не обязательно PyPI), один плоский каталог или файл html.

PS. Чтобы запретить pip просматривать пакеты в PyPI, используйте параметр --no-index.

person phd    schedule 20.03.2018