Oli*_*Oli 5 package-management python
作为运行多个 web 服务器的人,每个 web 服务器都运行一组 Django 站点,保持在我的 Python 堆栈之上是非常重要的。出于(可能是坏习惯),我依赖 Ubuntu 来获取我的许多 Python 包,包括python-django很多python-django-*额外的东西。这些网站需要这些来运行,但只要包仍然存在,这不是问题。我这样做而不是使用 VirtualEnv(等),因为我希望Ubuntu 安装安全更新。
然而,Ubuntu 存储库并不适合所有人。在某些情况下,我会使用pip或easy_install吸收最新版本的 Python 包。当您更新 Python 时(在 Ubuntu 中偶尔会发生这种情况),您会丢失所有已pip安装的软件包。
令我害怕的是我越深入,我管理的服务器越多,有一天会有一个操作系统更新,这需要我花费数小时的时间跑来跑去、测试站点、通过pip. 最糟糕的一点是客户端站点的潜在停机时间,尽管我在我的开发机器上进行了测试(总是在 Ubuntu-latest 上),所以这应该可以抵消一些担心。
我能做些什么来确保对 Python 的更新意味着提出现有的、非 dpgk 的 Python 包?
这将确保我始终可以访问相同的包。我仍然需要测试不兼容性,但这将是一个好的开始。
还有一个可能是更好的解决方案:其行为的应用程序一样apt,并dpkg而是与之交互的PyPI(其中pip,并easy_install获得大部分的魔力)。存储已安装软件包的本地列表,检查更新apt,管理安装等的东西。这样的东西存在吗?或者这是一个垃圾的想法?
关于当系统Python升级时如何保留你的Python包:我看到两个选项:
您可以使用以下命令安装非 Ubuntu Python 内容然后easy_install
--install-dir /usr/local/python确保所有 Web 应用程序都将该目录包含到 中sys.path,例如将其包含到 PYTHONPATH 中,或者使用自动包含的目录site.py(其文档指出“本地插件进入/usr/local/lib/python<version>/dist-packages”) )
您可以使用 virtualenvs,前提是您可以将所有应用程序数据和配置放置在独立于代码的目录中。这是一个草图程序:
A。将所有与代码无关的内容放入目录中
myapp-data/
b. 创建 virtualenv myapp-code.XXX/(其中XXX是一些唯一的版本号,例如date -I)
C。将应用程序代码和所有依赖包放入myapp-code.XXX
d.ln -s myapp-code.XXX myapp-code
当您必须升级时,只需重复步骤b即可。和c。使用不同的修订代码 YYY,然后:停止当前正在运行的应用程序,符号链接myapp-code到myapp-code.YYY,从 virtualenv 启动应用程序
myapp-code.YYY。如果出现问题,您仍然可以快速回滚到旧的 virtualenv。
显然,2. 需要更多工作(但pip加上一些 shell 脚本将使您在实现自动化方面有很长的路要走),但它也应该更加健壮,并且允许您同时运行依赖于某些 Python 包的不同版本的应用程序。
关于你关于apt-getPython 包的类似问题:
pip明确不允许这样的事情,并且有充分的理由:包 API 和行为可能会在不同版本之间发生变化。因此,如果您的代码在版本 X 上运行良好,则在使用版本 X+1 运行时可能会失败。这正是pip通过“冻结”和“需求列表”功能试图防止的。
当然,同样的论点也适用于像 Ubuntu 这样的二进制发行版中的任何程序。事实上,有用的apt-get是 Debian 和 Ubuntu 提供了可互操作软件包的协调发布:维护者付出了大量努力来确保主存储库中的所有 Ubuntu 软件包都是兼容的。
只是没有这样的 Python 包的协调发布:每个包都是独立的,并且没有关于其他 Python 包的版本与其兼容的信息。(这可能是 PyPI 元数据的一个很好的补充。)
| 归档时间: |
|
| 查看次数: |
1117 次 |
| 最近记录: |