Можно ли заставить pip распечатать используемую конфигурацию?
Есть ли способ получить pip для печати конфигурации, которую он попытается использовать? Для целей отладки было бы очень приятно знать, что:
- Файлы config.ini находятся в правильном месте, и pip находит их.
- Приоритет настроек конфигурации обрабатывается так, как можно было бы ожидать от документов
3 ответа
Для 10.0.x и выше
Есть новое pip config
команда, чтобы отобразить текущие значения конфигурации
pip config list
(Как указано @wmaddox в комментариях) Чтобы получить список того, где pip ищет файлы конфигурации
pip config list -v
До 10.0.x
Вы можете запустить консоль Python и сделать. (Если у вас есть virtaulenv, не забудьте сначала активировать его)
from pip import create_main_parser
parser = create_main_parser()
# print all config files that it will try to read
print(parser.files)
# reads parser files that are actually found and prints their names
print(parser.config.read(parser.files))
create_main_parser
это функция, которая создает parser
какой пункт используется для чтения параметров из командной строки (optparse
) и загрузка конфигов (configparser
)
Возможные имена файлов для конфигураций генерируются в get_config_files
, В том числе PIP_CONFIG_FILE
переменная окружения, если она установлена.
parser.config
это пример RawConfigParser
поэтому все сгенерированные имена файлов в get_config_files
передаются parser.config.read
,
Попытайтесь прочитать и проанализировать список имен файлов, возвращая список имен файлов, которые были успешно проанализированы. Если имя файла является строкой, оно рассматривается как одно имя файла. Если файл с именем в именах файлов не может быть открыт, этот файл будет игнорироваться. Это сделано для того, чтобы вы могли указать список возможных расположений файлов конфигурации (например, текущий каталог, домашний каталог пользователя и некоторый общесистемный каталог), и все существующие файлы конфигурации в списке будут прочитаны. Если ни один из названных файлов не существует, экземпляр ConfigParser будет содержать пустой набор данных. Приложение, которое требует загрузки начальных значений из файла, должно загрузить требуемый файл или файлы с использованием read_file() перед вызовом read() для любых необязательных файлов:
Вы можете запустить pip в pdb. Вот пример внутри ipython:
>>> import pip
>>> import pdb
>>> pdb.run("pip.main()", globals())
(Pdb) s
--Call--
> /usr/lib/python3.5/site-packages/pip/__init__.py(197)main()
-> def main(args=None):
(Pdb) b /usr/lib/python3.5/site-packages/pip/baseparser.py:146
Breakpoint 1 at /usr/lib/python3.5/site-packages/pip/baseparser.py:146
(Pdb) c
> /usr/lib/python3.5/site-packages/pip/baseparser.py(146)__init__()
-> if self.files:
(Pdb) p self.files
['/etc/xdg/pip/pip.conf', '/etc/pip.conf', '/home/andre/.pip/pip.conf', '/home/andre/.config/pip/pip.conf']
Единственный трюк здесь заключался в поиске пути базового парсера (и зная, что файлы там). Если вы этого еще не знаете, вы можете просто пройтись по программе или прочитать исходный код. Этот тип исследования должен работать для большинства программ Python.
Насколько я понимаю, ваш вопрос можно интерпретировать тремя способами:
- Какова конфигурация исполняемого файла pip?
Существует довольно обширная документация для конфигураций, поддерживаемых pip, см. Здесь: https://pip.pypa.io/en/stable/user_guide/
- Какую конфигурацию использует pip при настройке и последующей сборке кода, требуемого модулем Python?
Это определяется пакетом, который устанавливается. Ответственный за пакет отвечает за создание скрипта конфигурации. Например, у Numpy есть класс Configuration ( https://github.com/numpy/numpy/blob/master/numpy/distutils/misc_util.py), который они используют для настройки своей сборки Cython.
- Какие текущие модули установлены с pip, чтобы я мог воспроизвести конкретную конфигурацию среды?
Это просто, pip freeze > requirements.txt
, Это создаст файл со всеми установленными модулями pip вместе с их точными версиями. Вы можете сделать pip install -r requirements.txt
воспроизвести эту точную конфигурацию среды на другом компьютере.
Надеюсь, это поможет.