2016-08-03 5 views
0

Похоже, что если я позвоню pip.main() в свой код, мои настройки регистрации будут сброшены.pip.main() сброс настроек ведения журнала в python

Рабочий пример:

import logging 
import pip 

logger = logging.getLogger() 
logger.setLevel(logging.DEBUG) 

logging.debug("Test") 
# prints 'DEBUG:root:Test' 

pip.main(["install", "requests"]) 
# prints pip output 

logging.debug("Test") 
# doesn't print anything 

Любые идеи, как я могу избежать этого?

+0

Почему вы звоните 'pip.main' в коде? Это необычайно странная вещь. – jpmc26

+0

В моем проекте есть менеджер плагинов, который устанавливает с помощью pip. –

+0

Это может быть неприемлемой функциональностью для 'pip', но это то, что есть. ИМО Я ответил на ваш вопрос. –

ответ

0

Команда installpip перезаписывает конфигурацию ведения журнала. После этого вам необходимо выполнить сброс конфигурации, например. путем проведения

logger.setLevel(logging.DEBUG) 

еще раз после pip.main() звонок. Обратите внимание, что вам также может потребоваться добавить обработчики, если те, которые добавлены pip, не то, что вы хотите.

+0

Спасибо, но это неприемлемая функциональность для модуля. –

+0

@JacobTomlinson * полностью * подходит для функции, предназначенной для запуска, как инструмент командной строки вместо прямого вызова для настройки ведения журнала. – jpmc26

+0

@ jpmc26 Я согласен с этим, но разработчики проекта также согласились с тем, что в ситуации, когда он импортируется, он не должен изменять корневую регистрацию –

1

Оказалось, что это known issue в pip module.

Это связано с тем, что, когда был создан pip, он не предназначался для импорта в другие программы, поэтому соображения, подобные изменению конфигурации корневого журнала, не обсуждались.

Работа, предложенная проектировщиками проекта, заключается в использовании модуля subprocess для вызова самого вызова. Они открыты, чтобы вытаскивать запросы, чтобы решить эту проблему, но для этого потребуется большая работа над проектом.

Поэтому мой код теперь выглядит

import logging 
import subprocess 

logger = logging.getLogger() 
logger.setLevel(logging.DEBUG) 

logging.debug("Test") 
# prints 'DEBUG:root:Test' 

process = subprocess.Popen(["pip", "install", "requests"], 
          shell=False, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE) 
process.wait() 
# prints pip output 

logging.debug("Test") 
# prints 'DEBUG:root:Test' 
Смежные вопросы