# 46.1.Python 2 与 Python 3

PL/Python 支持 Python 2 和 Python 3 语言变体。(PostgreSQL 安装说明可能包含有关确切支持的 Python 次要版本的更精确信息。)由于 Python 2 和 Python 3 语言变体在某些重要方面不兼容,PL/Python 使用以下命名和转换方案来避免

  • 混合它们:PostgreSQL 语言命名plpython2u

  • 基于 Python 2 语言变体实现 PL/Python。PostgreSQL 语言命名plpython3u

  • 基于 Python 3 语言变体实现 PL/Python。被命名的语言plpythonu基于默认的 Python 语言变体实现 PL/Python,目前是 Python 2.(这个默认值独立于任何本地 Python 安装可能认为是它们的“默认值”,例如,/usr/bin/python可能是。)在遥远的未来版本的 PostgreSQL 中,默认值可能会更改为 Python 3,具体取决于 Python 社区中向 Python 3 迁移的进度。

    该方案类似于中的建议佩普 394 (opens new window)关于命名和过渡python命令。

    PL/Python for Python 2 或 Python 3 或两者都可用,这取决于构建配置或已安装的包。

# 提示

构建的变体取决于安装期间找到的 Python 版本或使用PYTHON环境变量;看第 17.4 节.要在一次安装中同时使用 PL/Python 的两种变体,源代码树必须配置和构建两次。

这导致以下使用和迁移策略:

  • 现有用户和当前对 Python 3 不感兴趣的用户使用语言名称plpythonu并且在可预见的未来不需要改变任何东西。建议通过迁移到 Python 2.6/2.7 逐步“面向未来”代码,以简化最终迁移到 Python 3 的过程。

    在实践中,许多 PL/Python 函数将迁移到 Python 3,而几乎没有更改。

  • 知道他们有大量依赖 Python 2 的代码并且不打算更改它的用户可以使用plpython2u语言名称。这将在遥远的未来继续发挥作用,直到 PostgreSQL 可能完全放弃对 Python 2 的支持。

  • 想要深入了解 Python 3 的用户可以使用plpython3u语言名称,按照今天的标准将永远有效。在遥远的将来,当 Python 3 可能成为默认值时,出于美学原因,他们可能希望删除“3”。

  • 胆大妄为,想搭建纯 Python-3 的操作系统环境,可以改plpythonu的扩展控制和脚本文件制作plpythonu相当于plpython3u,请记住,这会使他们的安装与世界其他大部分地区不兼容。

    另见文档Python 3.0 的新特性 (opens new window)有关移植到 Python 3 的更多信息。

    不允许在同一会话中使用基于 Python 2 的 PL/Python 和基于 Python 3 的 PL/Python,因为动态模块中的符号会发生冲突,这可能导致 PostgreSQL 服务器进程崩溃。有一个检查可以防止在会话中混合 Python 主要版本,如果检测到不匹配,它将中止会话。但是,可以从不同的会话在同一个数据库中使用这两种 PL/Python 变体。