2013-11-15 1 views
31

Я ищу способ установить пакет с помощью pip и записать информацию о версии этого пакета в файл требований .txt моего проекта. Для тех, кто знаком с npm, это по существу то, что делает npm install --save.Установите пакет и напишите в файл требований.txt с пиком

Использование pip freeze > requirements.txt отлично работает, но я обнаружил, что забыл запустить это или случайно включил неиспользуемые пакеты, которые я установил для тестирования, но решил не использовать.

Так следующее psuedocode:

$ pip install nose2 --save 

приведет ли в requirements.txt файл с:

nose2==0.4.7 

Я предполагаю, что я мог munge выход сохранить, чтобы захватить номера версий, но я я надеюсь, что есть более простой способ.

+1

написать bash и передать командную строку arg 'echo $ 1 >> requirements.txt; pip install $ 1' –

+2

Это не полное решение, потому что оно не разрешает корректную версию, так как pp freeze будет делать – dusktreader

ответ

11

Чтобы получить информацию о версии, вы можете использовать выборочную блокировку выборок после установки. Вот функция, которая должна выполнять то, что вы запрашиваете:

pip_install_save() { 
    package_name=$1 
    requirements_file=$2 
    if [[ -z $requirements_file ]] 
    then 
     requirements_file='./requirements.txt' 
    fi 
    pip install $package_name && pip freeze | grep -i $package_name >> $requirements_file 
} 

Обратите внимание на команду -i на команду grep. Пип не чувствителен к регистру с именами пакетов, поэтому вы, вероятно, захотите этого.

+1

Этот оператор grep может дублировать элементы в вашем файле требований. если 'django-example-package' уже находится в ваших требованиях, и вы устанавливаете' django'. В файле требований теперь будет добавлен пакет django-example-package. –

+0

Несомненно. Этот краевой случай можно обрабатывать с немного большей осторожностью с регулярным выражением. Я уверен, что есть другие способы, которые могут быть нарушены, но это хорошее начало, я думаю. – dusktreader

+1

@dusktreader Я использовал '^ $ package_name ==', и это выглядит хорошо. Редактирование все еще ждет pree-review. –

4

Просто добавьте как

л
function pips() { 
    echo $'\n'$1 >> requirements.txt; pip install $1 
} 

в ваш .bashrc или .bash_profile и использовать пипсы команду, чтобы установить пакет и сохранить его имя в requirements.txt примера:

pips django-waffle 

на основе Акашей Kothawale comment :)

+1

Это решает добавить имя пакета в файл требований.txt, но это оставляет часть версии мой вопрос: :) –

3

Я написал следующую функцию bash, которую я использую;

function pip-save() { 
    for pkg in [email protected]; do 
     pip install "$pkg" && { 
      name="$(pip show "$pkg" | grep Name: | awk '{print $2}')"; 
      version="$(pip show "$pkg" | grep Version: | awk '{print $2}')"; 
      echo "${name}==${version}" >> requirements.txt; 
     } 
    done 
} 

Это сохраняет требования к каноническому пакету требованиям, а также к установленной версии. Пример использования;

$ pip-save channels asgi_redis 
# will save the following to requirements.txt (as of writing): 
# --- 
# channels==1.0.1 
# asgi-redis==1.0.0 
# --- 
# note how asgi_redis is translated to its canonical name `asgi-redis` 
+0

Пожалуйста, не отправляйте тот же ответ на несколько вопросов! Если вопросы действительно имеют один и тот же ответ, один из них является дубликатом и должен быть помечен для закрытия как таковой. – miken32

+0

@ miken32 Я не согласен. Я думаю, что это лучший ответ до сих пор. –

+0

@AlexCory Я не сказал, что с ним что-то не так. Просто, что копирование и вставка ответов между вопросами - это не хорошая практика. – miken32

Смежные вопросы