安装Python包的最佳方法是什么?

什么是在Ubuntu 11中安装Python包的最佳方法?我最近转换到Ubuntu,并希望学习最佳实践。
为了背景,我想要安装tweeststream包,但是在我的Synaptic软件包管理器中没有找到它。另外,我对编程非常新手,但通常可以跟随代码示例。

请参见http://askubuntu.com/questions/21027/easy-install-pip-or-apt-get - Warrick
5个回答

更新:2019-05-11:此帖子主要提到virtualenv,但根据Python关于模块安装的文档,自Python 3.5起,“现在推荐使用venv创建虚拟环境”,而virtualenv是Python 3.4之前版本的替代方案。

更新:2018-08-17:自conda-4.4.0起,在所有平台上使用condaactivate Anaconda

更新:2017-03-27:PEP 513 - 用于PyPI的manylinux二进制文件

更新:2016-08-19:Continuum Anaconda选项

这在某种程度上是easy_install/pip或apt-get的重复内容。

对于全球范围内的 Python 包,请使用 Ubuntu 软件中心、apt、apt-get 或 synaptic

Ubuntu 在许多重要功能中使用Python,因此干扰Python可能会损坏您的操作系统。这是我从不在Ubuntu系统上使用pip的主要原因,而是使用Ubuntu软件中心、synapticapt-get或较新的apt,它们默认从Ubuntu存储库安装软件包。这些软件包经过测试,通常是预编译的,因此安装速度更快,最终专为Ubuntu设计。此外,还安装了所有所需的依赖项,并维护了安装日志,以便可以回滚安装。我认为大多数软件包都有相应的Launchpad存储库,因此您可以提交问题。

另一个使用Ubuntu软件包的原因是,有时这些Python软件包的名称取决于您从哪里下载它们。Python-chardet就是一个例子,它曾经在PyPI上被命名为一种东西,在Ubuntu存储库中被命名为另一种东西。因此,像pip install requests这样的操作将无法意识到chardet已经安装在您的系统中,因为Ubuntu版本具有不同的名称,结果会安装一个新版本,这可能会在某种微不足道的方式下损坏您的系统,但为什么要这样做呢?
总的来说,您只想将可信代码安装到您的操作系统中。所以,对于键入$ sudo pip <anything-could-be-very-bad>,您应该感到紧张。
最后,有些东西只是使用Ubuntu软件包更容易安装。例如,如果您尝试pip install numpy来安装numpy和scipy,除非您已经安装了gfortran、atlas-dev、blas-dev和lapack-dev,否则您将看到无尽的编译错误。然而,通过Ubuntu存储库安装numpy和scipy就像...
$ sudo apt-get install python-numpy python-scipy

你真幸运,因为你正在使用Ubuntu,这是一个得到广泛支持和经常更新的发行版之一。很可能你需要的每个Python包都在Ubuntu仓库中,并且可能已经安装在你的机器上了。而且,每隔6个月,将发布一个新的软件包周期,其中包含最新的Ubuntu发行版。
如果你对这个软件包完全有信心,确信它不会以任何方式干扰你的Ubuntu系统,那么你可以使用pip进行安装。Ubuntu非常友好地将这些软件包与发行版软件包分开放置,放在一个名为“dist-packages/”的文件夹中。Ubuntu仓库同时提供了pip、virtualenv和setuptools。然而,我赞同Wojciech的建议,使用virtualenv。
对于个人的Python项目,请在virtualenv中使用pip和wheel。

如果您需要最新版本,或者该模块不在Ubuntu软件仓库中,则启动一个virtualenv并使用pip安装该包。尽管pip和setuptools已经合并,但在我个人看来,与easy-install或distutils相比,我更喜欢使用pip,因为它会在将包完全下载和构建后再将其复制到您的文件系统中,并且使升级或卸载变得非常简便。在很多方面,它类似于apt-get,通常能很好地处理依赖关系。然而,您可能需要自己处理一些依赖关系,但自从采用了PEP 513,Python Package Index(PyPI)上现在有适用于Ubuntu和Fedora等流行Linux发行版的manylinux二进制文件。例如,现在NumPySciPy都作为manylinux wheels默认使用OpenBLAS而不是ATLAS进行Ubuntu发布。您仍然可以通过使用pip选项--no-use-wheel--no-binary <格式控制>从源代码构建它们。

~$ sudo apt-get install gfortran libblas-dev liblapack-dev libatlas-dev python-virtualenv
~$ mkdir ~/.venvs
~$ virtualenv ~/.venvs/my_py_proj
~$ source ~/.venvs/my_py_proj/bin/activate
~(my_py_proj)$ pip install --no-use-wheel numpy scipy

请参阅下一节,标题为"您不在sudoers中",以了解如何使用pip的"--user"安装方案将更新版本的pip、setuptools、virtualenv或wheels安装到您的个人配置文件中。您可以按照J.F. Sebastian在另一个答案中的评论所示,使用此方法来更新pip以供个人使用。注意:仅在MS Windows上更新pip时才真正需要使用"-m"选项。
python -m pip install --user pip setuptools wheel virtualenv

较新版本的pip会自动缓存wheels,因此以下内容仅适用于较旧的pip版本。由于您可能需要多次安装这些包,建议使用pip和wheel一起创建一个轮子库。自v13.0.0版本开始,virtualenv已经包含了wheel 因此,如果您的virtualenv版本过旧,您可能需要先安装wheel。
~(my_py_proj)$ pip install wheel  # only for virtualenv < v13.0.0
~(my_py_proj)$ pip wheel --no-use-wheel numpy scipy

这将在<cwd>/wheelhouse中创建二进制轮文件,使用-d指定不同的目录。现在,如果您启动另一个虚拟环境并且需要已经构建的相同软件包,则可以使用pip install --find-links=<fullpath>/wheelhouse从您的wheelhouse安装它们。
请阅读Python文档中的安装Python模块Python Package Index主页上的安装软件包。还有pip, venv, virtualenvwheel
如果你不在sudoers中,并且未安装virtualenv
另一个选择是使用虚拟环境,或者如果你正在使用没有root权限的Linux共享,则可以使用Python的distutils--user--home=<wherever-you-want> Python安装方案将软件包安装到site.USERBASE的值或任何其他位置。较新版本的pip还具有--user选项。请勿使用sudo
pip install --user virtualenv

如果你的Linux版本的pip太旧,那么你可以使用--install-option来传递设置选项,这对于向某些构建扩展的setup.py脚本传递自定义选项非常有用,比如设置PREFIX。你可能只需要提取分发并使用distutils以传统方式安装软件包,通过键入python setup install [options]。阅读一些安装文档distutils文档可能会有所帮助。
Python很好地将site.USERBASE添加到您的PYTHONPATH中,优先于其他任何内容,因此更改将仅对您有效。 --home的常见位置是~/.local。 有关确切文件结构以及特定的site-packages位置,请参见Python 模块安装指南。注意:如果使用--home安装方案,则可能需要将其添加到PYTHONPATH环境变量中,在您的.bashrc.bash_profile或在您的shell中使用export,以使您的本地化软件包在Python中可用。
使用Continuum Anaconda Python进行数学、科学、数据或个人项目

如果你在使用Python进行数学、科学或数据方面的工作,那么我强烈推荐Anaconda-Python发行版或更基本的miniconda发行版,由Anaconda, Inc.(以前被称为Continuum Analytics发布。尽管任何人都可以从使用Anaconda进行个人项目中受益,默认安装包括500多个数学和科学软件包,如NumPy、SciPy、Pandas和Matplotlib,而miniconda只安装Anaconda-Python和conda环境管理器。Anaconda只安装到你的个人配置文件夹下,即例如/home/<user>/并且修改了你的~/.bashrc~/.bash_profile,将Anaconda的路径添加到你的个人$PATH建议在你的~/.bashrc中使用conda.sh来启动anaconda,让你可以使用conda activate <env|default is base>命令 - 这只会影响你自己 - 你的系统路径不会改变。因此,不需要root访问权限或sudo来使用Anaconda!如果你已经将Anaconda-Python、miniconda或conda添加到了个人路径中,那么你应该从你的~/.bashrc中删除PATH导出,并更新为新的建议,这样你的系统Python将再次成为首选。

这与我在上一节中解释的--user选项有些相似,只不过它适用于整个Python而不仅仅是包。因此,Anaconda与您的系统Python完全独立,不会干扰您的系统Python,只有您可以使用或更改它。由于它安装了Python的新版本和所有库,所以您至少需要200MB的空间,但它非常聪明地缓存和管理库,这对于使用Anaconda进行一些酷炫操作非常重要。
Anaconda收集了Python二进制文件和依赖项所需的库,并将它们存储在一个在线仓库(以前称为binstar中,同时还作为不同的“频道”托管用户包。Anaconda使用的软件包管理器conda默认从Anaconda安装软件包,但您可以使用-c选项指定不同的“频道”。
pip一样使用conda安装软件包:
$ conda install -c pvlib pvlib  # install pvlib pkg from pvlib channel

但是conda可以做更多的事情!它还可以像virtualenv一样创建和管理虚拟环境。因此,由于Anaconda创建了虚拟环境,可以使用pip软件包管理器将PyPI中的软件包安装到Anaconda环境中,无需root或sudo权限。在Anaconda中不要使用sudo警告!但是,在Anaconda环境中混合使用pipconda时要小心,因为您需要更加谨慎地管理软件包依赖关系。在conda环境中,另一个选项是使用conda-forge channel代替pip,但最好在具有conda-forge作为默认通道的新conda环境中执行此操作。作为最后的选择,如果您无法在任何地方找到软件包,只能在PyPI上找到,请考虑使用--no-deps,然后使用conda手动安装剩余的依赖项。
Anaconda在某些方面也与Ruby RVM类似,如果你熟悉这个工具的话。Anaconda还可以使用conda创建带有不同Python版本的虚拟环境。例如:conda create -n py35sci python==3.5.2 numpy scipy matplotlib pandas statsmodels seaborn将在名为py35sci的新环境中创建一个科学/数据科学堆栈,使用Python 3.5。你可以使用conda切换环境。自从conda-4.4.0版本以后,这与virtualenv不同,后者使用source venv/bin/activate命令,但在conda-4.4.0之前,conda命令与virtualenv相同,并且也使用source命令。
# AFTER conda-4.4 
~/Projects/myproj $ conda activate py35sci

# BEFORE conda-4.4 
~/Projects/myproj $ source activate py35sci

但等等,Anaconda还可以安装不同的语言,比如用于统计编程的R,从Anaconda r 渠道中。你甚至可以设置自己的渠道来上传为conda构建的软件包分发。如上所述,conda-forgeconda-forge Anaconda 渠道上维护了许多PyPI上的软件包的自动化构建。
结语
根据个人需求和访问权限,在Linux上维护Python项目有很多选择。但是,如果有什么我希望你从这个答案中得到的东西是,你永远不应该使用sudo pip来安装Python软件包。使用sudo应该是一个警告,提醒你要特别小心,因为你会对整个系统进行更改,可能会产生不良后果。你已经被警告了。
祝你好运,编码愉快!

1我希望在我用pip乱用sudo破坏了系统的Python分发之前读过这篇文章。非常好的写作,感谢您提供这些信息。 - slhck
pip install numpy 应该会安装所有的依赖项。 - Timo
@Timo 正如我在2017-03-27的更新中提到的那样,自从PEP 513manylinux实施以来,PyPI上有可用的numpy二进制文件,它们是使用OpenBLAS构建的,也就是说它们具备了所需的依赖关系。然而,作为一条规则,pip install <package>只会安装在setup.pyinstall_requires部分列出的Python包依赖。例如:安装Jupyter不会安装Haskell库pandoc以将Jupyter笔记本导出为LaTeX等。 - Mark Mikofski
1与之相反,conda install <package>可能会安装所有的依赖项,包括C/C++、FORTRAN等,甚至还包括Haskell库,因为conda不仅仅管理Python包,它还管理环境。所以如果你安装了Anaconda或miniconda,然后运行conda install Jupyter,将会安装配方的meta.yml文件中的所有内容,包括pandoc Haskell库。欲了解更多信息,请参考PyPA - Mark Mikofski
1好的,但在尾声部分要注意措辞。要安装(系统范围或全局)Python软件包,你需要使用sudo,如$ sudo apt-get install python-numpy python-scipy。如果没有必要,不要在pip作为第一个命令时使用sudo,这是你想要表达的吗? - Timo

我认为对你来说最好的方法是安装Python包管理系统,比如"python-pip"。你可以通过Synaptic或Ubuntu软件中心来安装它。
Pip将允许你轻松地安装和卸载Python包,只需使用pip install package这样的命令即可。 在你的情况下,你可以在终端中输入类似以下的命令:
sudo pip install tweeststream

3这对于简单的软件包来说还可以,但对于较大的软件包(如numpy)就不太好了。 - hayd
@hayd: 为什么?这与http://askubuntu.com/questions/595366/using-pip3-installed-python-3-packages-when-apt-installed-packages-exist-too有关吗? - naught101
2@naught101 我想我可能是指scipy,不确定它是否相关...看起来pip在python路径中太晚了。我强烈推荐使用anaconda/conda,我认为它比pip要好得多。 - hayd
2在我看来,使用sudo pip <anything>应该非常小心。由于tweetstream不在Ubuntu软件中心中,我建议使用virtualenvtweetstream的setup.py需要anyjson,而anyjson是一个Ubuntu软件包。如果不在virtualenv中安装tweetstream,可能会导致其他依赖于anyjson的Ubuntu应用程序失败。要进行艰难的故障排除。 - Mark Mikofski
11重申一遍:在Ubuntu上不要使用sudo pip。@MarkMikofski:除非你有特定的原因,否则你不需要virtualenv。python -mpip install --user package-name 可以为当前用户安装包 packafe-name。如果有复杂的(大型C扩展)依赖关系,你可以使用apt-get来安装它们,以避免无必要地安装构建依赖。 - jfs

除了Novarchibald的补充之外,通常为您的Python项目创建一个虚拟环境并在其中安装依赖项是一个好主意。这样可以更好地控制依赖项及其版本。要设置虚拟环境,请输入:
virtualenv --no-site-packages --distribute my_python_project

然后,使用以下命令激活它:
cd my_python_project
source bin/activate

此时,您使用pip安装的任何内容都将保留在此虚拟环境中。如果您想要全局安装某个东西,那么您应该首先退出虚拟环境,使用以下命令:
deactivate

你可以在这里了解更多关于virtualenv的信息。


1或者,您可以使用虚拟环境的bin目录中的pip(这里是my_python_project/bin/pip)来维护该环境,而无需"激活"它。 然后,使用bin中安装的任何脚本,都是在使用给定的虚拟环境。 "激活"只是为了方便使用虚拟环境特定的bin目录来调用"python"、"easy_install"和"pip"。 - Jan Vlcinsky
Python的安装文档建议使用"pyvenv"来创建针对项目特定的虚拟环境;但是对于使用较旧版本Python的项目,可以使用virtualenv作为替代方案。详见https://docs.python.org/3/installing/index.html?highlight=pip。 - pbhj
2请注意,virtualenv选项--no-site-packages--distribute现在已经过时,并且不再起作用。 - Forage

除了Zetah的回答之外,从终端安装python-pip的命令是:
sudo apt-get install python-pip

试试这个 使用PyQt4开发的PIP GUI框架 使用PyQt4开发的PIP GUI框架
开始界面

enter image description here

开始屏幕包含用户选择要执行的过程的选项。
用户还可以指定他想要操作的Python版本。
文件菜单中有一个“退出”选项(快捷键:Ctrl+Q)和“刷新列表”选项,用于刷新包含软件包数据的资源文件。

安装界面

enter image description here

安装界面上有一个搜索栏,用户可以使用它来搜索并安装所需的软件包。

更新界面

enter image description here

更新屏幕显示了那些过时且可以升级的软件包列表。
卸载屏幕。

enter image description here

卸载屏幕显示了用户系统中已安装的软件包列表,并可以进行卸载。
进度窗口

enter image description here

进度窗口是 PIP-GUI 的内置终端小部件,用于显示在执行操作时运行的进程。

1欢迎来到Ask Ubuntu!虽然这理论上可以回答问题,但最好在这里包含答案的关键部分,并提供链接作为参考。 - Kevin Bowen