从virtualenv,pip freeze> requirements.txt给出垃圾的TONES!如何修剪它?

prz*_*_li 29 deployment django pip heroku virtualenv

我正在学习本教程:http: //devcenter.heroku.com/articles/django

在某些时候,我倾向于做:

pip freeze > requirements.txt
Run Code Online (Sandbox Code Playgroud)

(来自virtualenv创建的python实例)

我得到了这个:

(venv)przemoli@ubuntu:~/Programowanie/hellodjango$ cat requirements.txt 
BeautifulSoup==3.2.0
Brlapi==0.5.5
CherryPy==3.1.2
ClientForm==0.2.10
Django==1.3
GnuPGInterface==0.3.2
PAM==0.4.2
PIL==1.1.7
Routes==1.12.3
Twisted-Core==11.0.0
Twisted-Names==11.0.0
Twisted-Web==11.0.0
WebOb==1.0.8
adium-theme-ubuntu==0.3.1
apt-xapian-index==0.44
apturl==0.5.1ubuntu1
chardet==2.0.1
command-not-found==0.2.44
configglue==1.0
cssutils==0.9.8a1
defer==1.0.2
distribute==0.6.19
django-tagging==0.3.1
dnspython==1.9.4
duplicity==0.6.15
gnome-app-install==0.4.7-nmu1ubuntu2
httplib2==0.7.2
jockey==0.9.4
keyring==0.6.2
launchpadlib==1.9.8
lazr.restfulclient==0.11.2
lazr.uri==1.0.2
louis==2.3.0
lxml==2.3
mechanize==0.1.11
nvidia-common==0.0.0
oauth==1.0.1
onboard==0.96.1
oneconf==0.2.6.7
papyon==0.5.5
pexpect==2.3
piston-mini-client==0.6
protobuf==2.4.0a
psycopg2==2.4.4
pyOpenSSL==0.12
pycrypto==2.3
pycups==1.9.59
pycurl==7.19.0
pyinotify==0.9.1
pyparsing==1.5.2
pyserial==2.5
pysmbc==1.0.10
python-apt==0.8.0ubuntu9
python-dateutil==1.4.1
python-debian==0.1.20ubuntu2
python-virtkey==0.60.0
pyxdg==0.19
sessioninstaller==0.0.0
simplejson==2.1.6
system-service==0.1.6
ubuntu-sso-client==1.4.0
ubuntuone-couch==0.3.0
ubuntuone-installer==2.0.0
ubuntuone-storage-protocol==2.0.0
ufw==0.30.1-2ubuntu1
unattended-upgrades==0.1
usb-creator==0.2.23
virtualenv==1.6.4
wadllib==1.2.0
wsgiref==0.1.2
xdiagnose==1.1
xkit==0.0.0
zope.interface==3.6.1
Run Code Online (Sandbox Code Playgroud)

在heroku上部署时,它在Brlapi失败了.....

我在主要的python安装中看到很多东西在ubuntu上.这是不好的,因为Ubuntu本身就使用python(ubuntu-one,usb-creator等等).

我在heroku上不需要它们!我只需要Django,psycopg2及其依赖项.我甚至不知道它的pip或virutalenv的错.(如果您想了解我的设置,请查看上面的链接,我将其复制到终端)

zsq*_*are 27

这是一件让我烦躁不安的事情.当您创建没有--no-site-packages标志的virtualenv时会发生这种情况.

你可以做几件事:

  1. --no-site-packages旗帜创建virtualenv .
  2. 安装应用程序时,不要pip install <name>直接运行,而是将库添加到您的requirements.txt第一个,然后安装要求.这比较慢但确保您的要求得到更新.
  3. 手动删除您不需要的库.我遵循的经验法则是添加我INSTALLED_APPS和数据库适配器中的任何内容.由于依赖性,大多数其他必需的库将自动安装.我知道它很愚蠢,但这是我通常最终要做的事情.

- 编辑 -

我已经编写了几个脚本来帮助管理它.第一个运行pip冻结并将找到的库添加到提供的需求文件中,另一个运行pip install,然后将其添加到需求文件中.

function pipa() {
    # Adds package to requirements file.
    # Usage: pipa <package> <path to requirements file>
    package_name=$1
    requirements_file=$2
    if [[ -z $requirements_file ]]
    then
        requirements_file='./requirements.txt'
    fi
    package_string=`pip freeze | grep -i $package_name`
    current_requirements=`cat $requirements_file`
    echo "$current_requirements\n$package_string" | LANG=C sort | uniq > $requirements_file
}

function pipia() {
    # Installs package and adds to requirements file.
    # Usage: pipia <package> <path to requirements file>
    package_name=$1
    requirements_file=$2
    if [[ -z $requirements_file ]]
    then
        requirements_file='./requirements.txt'
    fi
    pip install $package_name
    pipa $package_name $requirements_file
}
Run Code Online (Sandbox Code Playgroud)

  • 注意:从1.7版开始,virtualenv默认采用`--no-site-packages`,因此不需要指定该选项.这是默认值.链接:http://pypi.python.org/pypi/virtualenv#changes-news (17认同)
  • 您也可以执行`pip freeze --local> requirements.txt`这将只输出安装到虚拟环境中的软件包,而不列出所有依赖项(软件包本身,处理它们.) (12认同)

Ber*_*ant 10

如果您非常关心您的清洁度,requirements.txt那么您不仅应该使用--no-site-packages已经提到的选项,还要考虑不要将输出pip freeze直接输出到您的requirements.txt.原因是,当pip freeze不仅自己指定的包显示时,还会显示这些包安装的依赖项!没有必要将它们全部保存在您的身上,requirements.txt因为它们将自动安装在需要它们的软件包中......所以,如果您向virtualenv添加一个新软件包,您可能应该将此软件包的行添加到您的requirements.txt.. .

看这个例子:

(demo)[~]$ pip freeze
distribute==0.6.19
wsgiref==0.1.2
(demo)[~]$ pip install django-blog-zinnia
Downloading/unpacking django-blog-zinnia
  Downloading django-blog-zinnia-0.9.tar.gz (523Kb): 523Kb downloaded
  Running setup.py egg_info for package django-blog-zinnia

    no previously-included directories found matching 'docs/api'
    no previously-included directories found matching 'docs/build'
    no previously-included directories found matching 'docs/coverage'
    no previously-included directories found matching 'zinnia/media/zinnia/css/.sass-cache'
Downloading/unpacking BeautifulSoup>=3.2.0 (from django-blog-zinnia)
  Downloading BeautifulSoup-3.2.1.tar.gz
  Running setup.py egg_info for package BeautifulSoup

  # truncated as it installs some more dependencies
Successfully installed django-blog-zinnia BeautifulSoup django-mptt django-tagging django-xmlrpc pyparsing
Cleaning up...
(demo)[~]$ pip freeze
BeautifulSoup==3.2.1
distribute==0.6.19
django-blog-zinnia==0.9
django-mptt==0.5.2
django-tagging==0.3.1
django-xmlrpc==0.1.3
pyparsing==1.5.6
wsgiref==0.1.2
Run Code Online (Sandbox Code Playgroud)

(虽然我可能会提到,在大多数情况下,如果你有这些依赖关系并不会受到伤害,只是你的文件会增长并且难以维护.)

  • 我认为你绝对应该在你的requirements.txt中保留所有间接依赖项,以及它们的版本号.这样你的构建是可重复的.我曾经把我的直接要求放在文件的顶部,而我的间接("传递")依赖关系在底部.现在我只是将它们全部保存在一个文件中,使用pip冻结生成信息,但是使用注释,并按字母顺序排列. (3认同)

Hai*_*ang 10

pipreqs解决了这个问题.它生成项目级的 requirements.txt文件.

  • 安装pipreqs: pip install pipreqs
  • 生成项目级requirements.txt文件:pipreqs /path/to/your/project/ 需求文件将保存在/path/to/your/project/requirements.txt中

  • 检查出来.会很好地完成这项工作. (2认同)