PostgreSQL 9.6.0上执行CREATE EXTENSION plpython3u时出错。

3
我在Windows 2012 R2服务器上安装了PostgreSQL Server 9.6.0和Python 3.4.2。我将plpython3.dll文件复制到C:/Program Files/PostgreSQL/9.6/lib/目录下,然后在PostgreSQL中尝试运行以下命令:CREATE EXTENSION plpython3u;但是却收到以下错误信息:"ERROR: could not load library "C:/Program Files/PostgreSQL/9.6/lib/plpython3.dll": The specified module could not be found."。 在目录C:\Program Files\PostgreSQL\9.6\share\extension下,有plpython3u文件。 请问我该如何使PostgreSQL识别Python 3扩展呢?谢谢!
5个回答

7

将python34.dll文件复制到c:\windows\system32并将其重命名为python33.dll。

这样创建语言plpython3u应该就没有问题了。


3
对我来说也是类似的情况。我安装了带有Python、Tcl等的edb postgres语言包的PostgreSQL 11.2版本,并且所有文件都在路径中。我还不得不将C:\edb\languagepack-11\x64\Python-3.6中的python36.dll复制到C:\Windows\System32中。 - monkeyhouse
1
我不得不复制python37.dll文件,用于Postgres 10。否则,扩展创建将失败。 - djm

2

我在使用Postgres 9.6 Windows 10时遇到了完全相同的情况。

PL/Python3U无法通过。

解决方法:

安装Python34 64位Windows 10版本。将Python34.dll复制到c:\ windows \ system32作为Python33.dll,然后它就可以工作了。


这个答案(实际上是一条评论)帮助我理解了python33.dll需要从Python安装文件夹复制到“System32”文件夹。被采纳的答案没有明确说明这一点,只是说“在c:\windows\system32中复制python34.dll文件并将其命名为python33.dll”,我错误地认为该文件已经存在于“System32”文件夹中,然后需要将其作为另一个名称复制到同一文件夹中 - questionto42
@questionto42 这很简单。文件名和路径存储在 plpython3.dll 中。因此,您需要完全相同的路径和名称。但是请注意,更改此名称会对其他产品产生影响,因为您声明 v3.4 是系统中的 v3.3。 - GeoStoneMarten
@GeoStoneMarten 这不是关于那个的问题。我只是被“在...中制作副本”所困惑。我以为指的是同一个文件夹(system32)。这就是为什么我现在编辑了另一个答案,说“从...复制到...”。其他部分都很清楚。 - questionto42

1

这些信息在源安装包的Makefile中。

我们需要将libpython作为共享库。在Python >=2.5中,configure会直接询问Python。但由于这在Debian上已经存在很长时间的问题 (http://bugs.debian.org/695979),为了支持旧版本的Python,我们会查找是否有一个命名类似于共享库的文件作为备用方案。

对于Python Windows:

ifeq ($(PORTNAME), win32)

    pytverstr=$(subst .,,${python_version})
    PYTHONDLL=$(subst \,/,$(WINDIR))/system32/python${pytverstr}.dll

因此正确的答案是:

  • WINDIR 是: C:\Windows
  • 在 makefile 中使用 pytverstr 参数来定义 python 版本
  • PYTHONDLL 是 dll 的位置

要检查我的安装版本,我打开位于 C:\Program Files\PostgreSQL\9.4\lib(更改路径以符合您的环境)的 plpython3.dll

使用 Notepad++ 并搜索 PyUnicode_AsUTF8String,Python DLL 版本将显示在最后一个单词中(在我的情况下为 python33.dll)

检查您的安装以选择正确的 Python 安装程序

SELECT version();

PostgreSQL 9.4.15是由Visual C++ build 1800编译的64位版本。

因此,我需要安装64位的Python 33。

编辑于2020年10月2日

在二进制文件的文档..pgsql\doc\installation-notes.html中也包含了所有这些信息,请查看过程化语言标题。

编辑于2021年6月11日

在系统上安装好正确版本的Python后,您需要将其复制到C:\Windows\System32目录下。

用旧名称替换Python版本不是一个好的解决方案,因为它可能与该版本不兼容。如果您知道风险,请这样做。所以,如果您想要最新版本的Python来使用plpython,可以自行编译或检查edb编译是否包含您所需的内容。您可以向EDB咨询此信息。


在设置了两个PATH变量并安装了正确的Python版本后,我也遇到了这个错误。这个答案值得一看,因为它解释了python33.dll的一些背景知识,而不是仅仅推荐安装正确的Python版本,因为仅仅安装正确的版本并不能修复问题报告中的错误。 - questionto42
@questionto42 请不要在字里行间读取。所有的Postgresql都是包和特定版本的产品构建而成,我会解释使用的路径。所以我不谈论PATH,将Python设置在PATH中并不是一个好的做法,当你有很多使用不同版本的Python环境的产品时。Postgresql建议在启动脚本中设置特定的Python路径。设置Windows的PATH没有影响,因为路径在构建时被静态声明。如果您想指定其他路径,可以阅读Python和Postgresql的文档。 - GeoStoneMarten
@questionto42 对于覆盖路径,您需要知道 https://www.postgresql.org/docs/9.6/plpython-envar.html,并且对于环境Python变量,请参阅 https://docs.python.org/3/using/cmdline.html#environment-variables。 - GeoStoneMarten
你说得对,我不知道为什么会认为你在报告关于设置路径的事情。我现在没有看到任何设置PATH变量的内容,因此是我的错。相反,你详细解释了为什么需要手动进行复制和重命名操作,这当然是有价值的。顶起! - questionto42
我认为你不需要添加所需路径,已接受的答案就足够了。无论如何,我已经安装了带有Python 3.7和python37.dll的PostgreSQL 13(无需重命名)并且安装成功,但是一旦我使用plpython3u,数据库就会崩溃,这就是为什么我在[PostgreSQL 13 + Python 3.7.9 + plpython3u: 'psql: server closed the connection unexepectedly.' + 'The application has lost the database connection.'](https://dev59.com/kGMLtIcB2Jgan1znMKnZ)上发布了一个新问题的原因。 - questionto42
显示剩余4条评论

0

官方包中的plpython3.dll是针对Python 3.3构建的,而不是Python 3.4。它期望在system32文件夹中找到python33.dll。您需要为系统安装Python 3.3。

由于py33已经被淘汰,因此您可能很快会感到沮丧,因为缺乏预构建的二进制包,lxml、pyzmq等都需要从源代码构建。如果您需要任何二进制模块,请确保您已正确设置编译器。


不行,因为这取决于Python的小版本和输出,这在安装文档中有说明。 - GeoStoneMarten

0
这可能会有所帮助,我曾经为此苦苦挣扎。对我来说,只有当我安装了正确的版本的Python并将路径添加到环境变量中时才起作用。我不确定Python 3.4.0是否适用于PostgreSQL Server 9.6.0,但它与PostgreSQL Server 10.0一起使用效果很好。

尝试使用Windows 64位的python-3.4.0.amd64版本或从Python 3.4.0下载链接下载其他版本

要添加的环境变量:

C:\Python34\Scripts C:\Python34\


踩反对并不能解决问题。问题描述中报告的错误不是在安装正确的Python版本和设置好两个PATH变量之前发生的,而是在之后发生的。我刚刚测试过了。你自己也说这只是“可能有帮助”,但它并没有回答问题。这只值得作为评论,而不是答案。 - questionto42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接