Windows上的Python包安装

15 投票
2 回答
4340 浏览
提问于 2025-04-16 00:39

我最近开始学习Python,但对如何分发和安装包有点困惑。

我知道安装包的官方方式是distutils:你需要下载源代码压缩包,解压后运行:python setup.py install,然后模块就会自动安装。

我还知道setuptools,它带有一个叫easy_install的辅助脚本。它使用egg格式来分发包,听说是建立在distutils之上的,做的事情和上面一样,还会处理一些依赖关系,这些依赖都是从PyPi上获取的。

然后还有pip,我仍然不太明白它和其他的有什么不同。

最后,由于我在使用Windows电脑,很多包还提供了通过windows installer的二进制版本,特别是那些需要编译C/Fortran代码的包,要是在Windows上手动编译可真是个噩梦(假设你已经有了MSVC或MinGW/Cygwin的开发环境,并且设置好了所有必要的库……不过试着自己编译numpy或scipy,你就会明白了!)

所以,有人能帮我理清这些内容吗?解释一下每种方法的区别、优缺点。我想知道它们是如何管理包的(比如Windows注册表、配置文件等)。特别是,你是如何管理所有第三方库的(能列出已安装的包,禁用/卸载等)?

2 个回答

0

我在用Windows和Python,感觉有点烦,因为用pip安装东西并不总是顺利。Python现在在逐步转向使用pip,所以我还是在用它。pip挺不错的,因为你可以卸载一些东西,还可以使用

pip freeze > requirements.txt
pip install -r requirements.txt

我喜欢pip的另一个原因是它可以和像venv这样的虚拟环境一起使用,特别是在Python 3.4上。我发现在Windows上使用venv比使用virtualenv要简单得多。

如果你无法安装某个包,你就得找它的二进制文件。你可以去这个网站看看:http://www.lfd.uci.edu/~gohlke/pythonlibs/

我发现这些二进制文件非常有用。

pip正在尝试制作一种叫做wheel的东西,用于二进制安装。

pip install wheel
wheel convert path\to\binary.exe
pip install converted_wheel.whl

你还需要为任何无法安装的必要库做同样的事情,因为这些库是那个包所需要的。

11

我使用的是pip,并且不在Windows上,所以无法提供与Windows安装程序选项的比较,只能分享一些关于pip的信息:

  • Pip是建立在setuptools之上的,使用它之前需要先安装setuptools。
  • Pip是对setuptools中easy_install的替代和改进。它不仅能做easy_install能做的事情,还能做更多的事情,比如在安装之前确保所有需要的包都能下载,以避免安装失败,列出已安装的包和版本,卸载包,搜索PyPI,按照需求文件安装多个包和版本等等。
  • 目前,pip不支持安装任何形式的预编译或二进制包,所以如果有扩展需要编译,只有在你有合适的编译器时才能安装。支持从Windows二进制安装程序安装的功能在计划中,但具体什么时候实现还不清楚。
  • 直到最近,pip在Windows上的支持不太稳定,也没有经过充分测试。多亏了Dave Abrahams的努力,pip现在在Windows上通过了所有测试(还有一个持续集成服务器帮助我们确保它保持这样),但还没有发布包含这些工作的版本。因此,更可靠的Windows支持应该会在下一个版本中推出。
  • 所有标准的Python包安装机制都会把已安装包的所有元数据存储在与实际安装包相邻的文件中。Distutils使用一个名为distribution_name-X.X-pyX.X.egg-info的文件,而pip使用一个类似名称的目录,里面有多个元数据文件。Easy_install则把一个包的所有Python代码放在自己的zip文件或目录中,并在该目录内放置一个EGG-INFO目录,里面包含元数据。如果你在交互式提示符下导入一个Python包,可以检查package.__file__的值;你应该能在附近找到该包的元数据。
  • 已安装包的信息只会被操作系统特定的打包工具(如Windows安装程序、Apt或RPM)存储在某种全局注册表中。标准的Python打包工具不会修改或关注这些列表。
  • Pip(或者说任何Python打包工具)最好与virtualenv一起使用,这样你可以为每个项目创建独立的Python小环境,在这些环境中安装包而不会影响到整个系统。每个新的virtualenv都会自动安装pip。

还有一些其他项目你可能也想了解(没错,还有更多!):

  • distribute是setuptools的一个分支,增加了一些额外的bug修复和功能。
  • distutils2旨在成为Python打包的“下一代”。它希望能吸收distutils/setuptools/distribute/pip的最佳功能。它正在独立开发,目前还不能使用,但最终应该会替代Python标准库中的distutils,成为事实上的Python打包解决方案。

希望这些信息能帮助你更清楚一些!祝好运。

撰写回答