当前位置: 首页 > 知识库问答 >
问题:

如何在Linux上安装Python包,以便已在运行的PostgreSQL 13 plpython3u扩展可以找到它?

阙繁
2023-03-14

我试图抓住"模块未找到"的想法时导入一个Python包在plpython3u过程中,我不知道如何使用接受的答案,使它在Linux上运行。通常情况下,这里应该是重复的,但是如果在使用的路径上与MacOS有差异,那么对于一个新问题来说可能是好的。

我在WSL2上(Ubuntu 20.04)。我安装了来自Ubuntu PostgreSQL Apt存储库的官方PostgreSQL下载页面的命令。

# Create the file repository configuration:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

# Import the repository signing key:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

# Update the package lists:
sudo apt-get update

# Install the latest version of PostgreSQL.
# If you want a specific version, use 'html" target="_blank">postgresql-12' or similar instead of 'postgresql':
sudo apt-get -y install postgresql

这给了我PostgreSQL 13。

我安装plpython3u命令从PostgreSQL:如何安装plpythonu扩展:

sudo apt-cache search ".*plpython3.*"
sudo apt-get install postgresql-contrib postgresql-plpython3-13

因为我在WSL上,所以我开始使用以下服务:

service postgresql start

更改角色并运行psql:

sudo su postgres
psql

在postgreSQL中直接将Python版本作为存储过程进行检查:

CREATE OR REPLACE FUNCTION return_version()
  RETURNS VARCHAR
AS $$
    import sys
    return sys.version
$$ LANGUAGE plpython3u;

输出:

CREATE FUNCTION

测试:

postgres=# SELECT return_version();
              return_version
------------------------------------------
 3.8.10 (default, Jun  2 2021, 10:49:15) +
 [GCC 9.4.0]
(1 row)

显示安装了"PostgreSQL 13"和"Python 3.8.10"。

这正是在Linux上可以找到的。如果我只是输入一个我没有的Python版本,比如3.7

python3.7

我得到了概述:

Command 'python3.7' not found, did you mean:

  command 'python3.8' from deb python3.8 (3.8.10-0ubuntu1~20.04)
  command 'python3.9' from deb python3.9 (3.9.5-3~20.04.1)
  command 'python2.7' from deb python2.7 (2.7.18-1~20.04.1)

确认没有安装两个并行安装的Python3.8,很明显,Linux3.8.10是PostgreSQL中用于plpython3u的版本。

简而言之,我尝试了一个导入包的函数,该函数取自PostgreSQL中的Kmeans:

CREATE OR replace FUNCTION kmeans(input_table text, columns text[], clus_num int) RETURNS bytea AS
 
$$
 
from pandas import DataFrame
from sklearn.cluster import KMeans
from pickle import dumps
 
all_columns = ",".join(columns)
if all_columns == "":
    all_columns = "*"
 
rv = plpy.execute('SELECT %s FROM %s;' % (all_columns, plpy.quote_ident(input_table)))
 
frame = []
 
for i in rv:
    frame.append(i)
df = DataFrame(frame).astype('float')
kmeans = KMeans(n_clusters=clus_num, random_state=0).fit(df._get_numeric_data())
return dumps(kmeans)
 
$$ LANGUAGE plpython3u;

输出:

CREATE FUNCTION

测试抛出错误:

postgres=# SELECT kmeans('my_table', ARRAY['col1', 'col2'],3);
ERROR:  ModuleNotFoundError: No module named 'pandas'
CONTEXT:  Traceback (most recent call last):
  PL/Python function "kmeans", line 3, in <module>
    from pandas import DataFrame
PL/Python function "kmeans"

然后,我在Python3.8中安装了熊猫:

python3.8 -m pip install pandas
Collecting pandas
  Downloading pandas-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.5 MB)
     |████████████████████████████████| 11.5 MB 6.0 MB/s
Collecting python-dateutil>=2.7.3
  Downloading python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
     |████████████████████████████████| 247 kB 4.7 MB/s
Collecting numpy>=1.17.3
  Downloading numpy-1.21.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (15.8 MB)
     |████████████████████████████████| 15.8 MB 131 kB/s
Collecting pytz>=2017.3
  Downloading pytz-2021.1-py2.py3-none-any.whl (510 kB)
     |████████████████████████████████| 510 kB 5.7 MB/s
Requirement already satisfied: six>=1.5 in /usr/lib/python3/dist-packages (from python-dateutil>=2.7.3->pandas) (1.14.0)
Installing collected packages: python-dateutil, numpy, pytz, pandas
  WARNING: The scripts f2py, f2py3 and f2py3.8 are installed in '/home/my_user/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed numpy-1.21.2 pandas-1.3.2 python-dateutil-2.8.2 pytz-2021.1

熊猫现在存放在:

python3.8 -m pip show pandas
Name: pandas
Version: 1.3.2
Summary: Powerful data structures for data analysis, time series, and statistics
Home-page: https://pandas.pydata.org
Author: The Pandas Development Team
Author-email: pandas-dev@python.org
License: BSD-3-Clause
Location: /home/my_user/.local/lib/python3.8/site-packages
Requires: numpy, python-dateutil, pytz
Required-by:

但是测试仍然会抛出相同的错误:

postgres=# SELECT kmeans('my_table', ARRAY['col1', 'col2'],3);
ERROR:  ModuleNotFoundError: No module named 'pandas'
CONTEXT:  Traceback (most recent call last):
  PL/Python function "kmeans", line 3, in <module>
    from pandas import DataFrame
PL/Python function "kmeans"

如何安装熊猫(或我需要的任何其他包),以便它是由PostgreSQL 13 plpython3u扩展Linux?

衍生问题中有另一个版本测试,但在扩展中没有显示任何内容,命令与普通bash中的命令完全相同。所以,下面的值被简化为plpython3u函数的随机测试。我添加这一点只是因为你永远不应该100%确定。对我来说,很明显,这并没有说明plpython3u实际使用的Python版本。

CREATE OR REPLACE FUNCTION get_py()
  RETURNS VARCHAR
AS $$
    import os
    return os.popen('which python3').read()
$$ LANGUAGE plpython3u;

输出:

CREATE FUNCTION

测试:

SELECT get_py();
      get_py
------------------
 /usr/bin/python3+

(1 row)

“哪个python3一样。8'

select get_py();
       get_py
--------------------
 /usr/bin/python3.8+

(1 row)

也许在安装之前,Python的默认版本必须在某个地方进行更改?这只是使用make进行安装时的一个非常模糊的猜测,在/etc/make中使用Python设置。conf,这里是这里使用的代码(2018年的问题):

/etc/make.conf更改为

DEFAULT_VERSIONS+= python=3.6

据说这是通过plpython3u运行并安装的(我还没有测试过):

root@db% cd /usr/ports/databases/posgresql10-plpython
root@db% make fetch
root@db% make extract
root@db% cd /usr/ports/databases/postgresql10-plpython/work/postgresql-10.5
root@db% ./configure PYTHON=/usr/local/bin/python3 --with-python --with-libraries=/usr/local/lib --with-includes=/usr/local/include/
root@db% cd /usr/ports/databases/posgresql10-plpython
root@db% make install

共有1个答案

闻人博
2023-03-14

问题是:

python3.8-m pip安装熊猫

在运行命令的用户的主目录中安装一个包(在这种情况下是熊猫)到site-包,这样:

/home/my_user/。local/lib/python3。8/站点包

Postgres中运行的plpython3u扩展正在系统范围的站点包中查找该包。要在那里获得软件包,您需要执行以下操作:

sudo蟒蛇3。8-m pip安装程序

 类似资料:
  • 问题内容: 我有一个Python项目,其中包含许多与distutils打包在一起的子模块。我想在C中构建一些Python扩展以生活在其中一些子模块中,但是我不明白如何使Python扩展生活在子模块中。以下是我正在寻找的最简单的示例: 这是我的Python扩展: 这是可行的: 在virtualenv中安装后,我可以这样做: 但是,我想生活在一个子模块中。我需要在此管道中进行哪些更改才能使Python

  • 问题内容: 我使用apt-get install安装了JDK,但不知道jdk文件夹在哪里。我需要为此设置路径。有人知道这个位置吗? 问题答案: 这取决于您的打包系统…如果该命令有效,则可以键入以查找java命令的位置。我现在在OpenSUSE系统上返回(但这不是使用的系统)。 在Ubuntu上,它看起来像是在 OpenJDK中,在Suns JDK的其他子目录中(我也认为还有其他实现)。 Debia

  • 我想在python 3.7.4做: 得到这个错误: 我已经试过了: 使用和 使用本地windows和windows服务器 多次重新安装不同版本的软件包(例如和) Traceback(最近一次调用最后一次):文件"c:/用户/管理员/文档/GitHub/合同-标准-标识符-on-aws/schnelltest.py",第1行,在导入gensim文件"C:\用户\管理员\AppData\本地\程序\P

  • 问题内容: 简而言之,我需要能够将已编译的可执行文件粘贴到Java jar文件中,然后能够从Java运行它(可能通过)。 的 原因 ,是我想使用Java来包裹ImageMagick的可执行文件成分的图像处理弹性的Map Reduce任务。EMR只希望获取一个jar文件,因此我认为没有空间在旋转的数据节点上安装软件。 问题答案: jar中的可执行文件是一种资源,您可以通过Stream访问它,并将可执

  • 问题内容: 我有一个弹性beantalk linux-tomcat ami实例,其中安装了示例应用程序,并且可以处理公共dns。我可以ssh进入实例,但是找不到tomcat 7的住处(即用于编辑server.xml的conf目录)。我已经尝试了64位和32位ami。关于我在哪里可以找到的任何想法?我看了下: 我确实在(下为空)下找到了一个文件。 我做了: 而且该示例应用程序也可以通过公共DNS 提

  • 问题内容: 所以我有一个Python脚本: 我正在执行这样的: 但是,我必须安装Python并将其包含在环境变量中才能正常工作。 是否可以通过某种方式将Python可执行文件与Python脚本“捆绑”在一起,以便其他人可以在没有Python的情况下在其PC上运行它? 如果只能在Windows中使用,可以。 编辑: 尝试后,我得到此错误: 问题答案: 这是一种实现方法(对于Windows,使用)。