2016-01-25 3 views
4

Мне интересно, как работает pip. Everytime я побежал пипс в командной оболочке в окнах, как этотRun pip in python idle

c:\python27\script>pip install numpy 

Но, я задавался вопросом, могу ли я запустить его в питон холостых.

import pip 
pip.install("numpy") 

К сожалению, это не работает.

+7

Попробуйте 'pip.main ([" install "," --user "," somepackagenamehere "])' например. –

ответ

1

В настоящий момент нет официального способа сделать это, вы можете использовать pip.main, но текущий сеанс бездействия не будет «видеть» этот установленный пакет.

Было много обсуждений за how to add a "high level" programmatic API for pip, это кажется многообещающим.

+0

Действительно ли вы протестировали утверждение о том, что текущий сеанс IDLE не увидит новый пакет? Я уверен, что если вы добавите пакет в сайт-пакеты любыми способами, будь то с помощью pip или иначе, из командной строки или иным образом, он должен быть доступен для следующего оператора импорта, запускаемого той же версией python, независимо от того, является ли IDLE вовлечены или нет. Я просто попытался установить подушку из командной строки, когда IDLE запущен, и сразу же «импортировать PIL». –

+0

@Terry Я пытался использовать IDLE с py2exe с помощью pip.main, он не мог импортировать вскоре после этого. Думаю, может быть, потому что эта установка, которую я тестировал, была новой, и я использовал флаг «--user» на пипе. –

+0

У меня есть Python, установленный для всех пользователей и не использующий флаг -user. В подсказке pip говорится: «Установите в каталог установки пользователя Python для вашей платформы. Обычно ~ /.local/или% APPDATA% \ Python в Windows. (Подробнее см. Документацию на Python для сайта.USER_BASE.) «У моего sys.path на самом деле есть« C: \\ Users \\ Terry \\ AppData \\ Роуминг \\ Python \\ Python35 \\ site-packages ', 'Убедитесь, что где pip фактически помещает файлы с -user в соответствие с тем, что находится на sys.path. –

2

На самом деле, я думаю, вы можете использовать subprocess.Popen(apt-get numpy), не знаете, как это сделать с помощью PIP.

+0

Вам нужно либо процитировать команду, переданную Popen, в этом случае' 'apt-get numpy" ', либо передать список строк , такие как ['pip', 'install', 'numpy']. По причине, приведенной в моем ответе, использование подпроцесса в настоящее время является самым простым способом запуска pip из программы python. –

3

Этот вопрос должен быть или должен быть о том, как запустить pip из программы python. IDLE не имеет прямого отношения к этой версии quesiton.

Чтобы развернуть комментарий Дж. Дж. Хакалы: такая строка, как pip install pillow, разбивается на пробелы, чтобы стать sys.argv. Когда pip запускается как основной модуль, он вызывает pip.main(sys.argv[1:]). Если один импортирует пип, можно позвонить pip.main(arg_line.split()), где arg_line является частью командной строки после pip.

Прошлый сентябрь (2015 г.) Я экспериментировал с использованием этого непреднамеренного API из другой программы python и сообщил о начальных результатах по проблеме трекера 23551. Затем были обсуждены и дальнейшие результаты.

Проблема с выполнением нескольких команд в одном процессе заключается в том, что некоторые команды команд кэшируют не только sys.path, который обычно остается постоянным, но также и список установленных пакетов, который обычно изменяется. Поскольку pip предназначен для запуска одной команды для каждого процесса, а затем выхода, он никогда не обновляет кеш. Когда pip.main используется для запуска нескольких команд в одном процессе, команды, заданные после кэширования, могут использовать устаревший и не более корректный кеш. Например, list после install показывает, как было before the install.

Вторая проблема для программы, которая хочет изучить вывод из пипа, заключается в том, что он переходит к stdout и stderr. Я разместил program, который захватывает эти потоки в программные переменные как часть запущенного пипа.

Использование вызова подпроцесса для каждой команды pip, как предложено L_Pav, хотя и менее эффективно, решает обе проблемы. Метод communicate делает выходные потоки доступными. См. Подпроцесс doc.