PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

ERRO:não foi possível acessar o arquivo “$libdir/plpython2” – ERRO:não foi possível acessar o arquivo “$libdir/plpython3”

Erro acima descrito na correspondência do PG, pois não consegue CREATE LANGUAGE plpython2u/plpython3u no PG9.3Beta.
Error:
postgres=# create language plpython3u;
ERROR: could not access file "$libdir/plpython3": No such file or directory

postgres=# create language plpython2u;
ERROR: could not access file "$libdir/plpython2": No such file or directory

Antes de fazer algum estudo sobre os erros acima, li abaixo o link da documentação do PG sobre como o PostgreSQL permite criar plpython de linguagem e como eles devem ser configurados.

http://www.postgresql.org/docs/9.3/static/plpython-python23.html

Está claro no link acima que você precisa compilar o binário duas vezes se precisar de plpython2u e plpython3u. AFAIK, ActivePython 2.7.x para plpython2u e 3.2.x para plpython3u podem ser configurados no PG 9.2.x sem nenhuma dificuldade, mas nunca experimentei o PG 9.3Beta2. Então, pensando em tentar e analisar o erro sobre por que e como ele poderia ser reparado, primeiro comecei a instalação do código-fonte definindo o caminho base com o ActivePython 3.2. (Link de download do ActivePython http://www.activestate.com/activepython/downloads)
[root@localhost postgresql-9.3beta1]# export PATH=/opt/ActivePython-3.2/bin:$PATH
[root@localhost postgresql-9.3beta1]# ./configure --prefix=/usr/local/pg93b --with-python

A compilação falhou e mostrou um erro no arquivo Config.log como:
make[3]: Entering directory `/usr/local/src/postgresql-9.3beta1/src/pl/plpython'
*** Cannot build PL/Python because libpython is not a shared library.
*** You might have to rebuild your Python installation. Refer to
make[3]: Leaving directory `/usr/local/src/postgresql-9.3beta1/src/pl/plpython'

Na documentação do PG, temos instruções claras sobre o erro acima e por que isso acontece, o plpython será uma biblioteca compartilhada na maioria das plataformas, mas em algumas plataformas precisamos forçar especificamente o compilador como python da biblioteca compartilhada. Para isso, você pode prosseguir para /src/pl/python/Makefile para alterações ou declarar especificamente “shared_libpython=yes” durante a compilação.

A compilação do código-fonte examina dois arquivos quando você usa –with-python que são “python” e “python-config”. Embora eu tenha ActivePython-3.2 no meu caminho base, o compilador ainda não consegue encontrá-los “python” &“python-conifg”
[root@localhost postgresql-9.3beta1]# which python
/usr/local/bin/python
[root@localhost postgresql-9.3beta1]# which python-config
/usr/local/bin/python-config

É porque, no ActivePython 3.2, os nomes dos arquivos serão “python” como “python3” e “python-config” como “python3-config”, portanto, o compilador apontou para o antigo em vez do novo. Neste ponto, Asif Naeem (Obrigado pela sua visão) do nosso Dev principal. A equipe me notificou para zombar de arquivos ActivePython-3.2 existentes como python &python-config. É quase como um hack dele, então dupliquei esses arquivos como:
cd /opt/ActivePython-3.2/bin
cp python3-config python-config
cp python3 python

Ok, agora eu posso ver isso no meu caminho base.
[root@localhost postgresql-9.3beta1]# export PATH=/opt/ActivePython-3.2/bin:$PATH
[root@localhost postgresql-9.3beta1]# which python
/opt/ActivePython-3.2/bin/python
[root@localhost postgresql-9.3beta1]# which python-config
/opt/ActivePython-3.2/bin/python-config

Eu recompilei a fonte do PG usando –with-python após as alterações e também forçando o compilador a escolher SHARED_LIBPYTHON usando “shared_libpython”.
./configure --prefix=/usr/local/pg93b3 --with-python
make shared_libpython=yes
make shared_libpython=yes install

Essas etapas compilarão efetivamente o PG9.3Beta com as bibliotecas ActivePython-3.2. Agora vamos criar a linguagem plpython3u:
-bash-4.1$ psql -p 4444
psql (9.3beta1)
Type "help" for help.

postgres=# create language plpython3u;
The connection to the server was lost. Attempting reset: Failed.
!>
!>

Oops, isso é estranho, porque ele travou agora.. Neste tipo de situação $PGDATA/pg_log são seus amigos para entender o problema. Aqui estão as informações de log do servidor de banco de dados sobre falha:
2013-07-13 22:08:37 IST-31208-postgres-postgres :LOG: statement: create language plpython3u;
Could not find platform independent libraries
Could not find platform dependent libraries
Consider setting $PYTHONHOME to [:]
Fatal Python error: Py_Initialize: Unable to get the locale encoding

OK. Eu deixei de definir caminhos python, isso é muito importante quando você está trabalhando com linguagens python ou perl em seu banco de dados.
Eu configurei PYTHONHOME, PYTHONPATH &LD_LIBRARY_PATH antes de iniciar o cluster.
export PYTHONHOME=/opt/ActivePython-3.2/
export PYTHONPATH=/opt/ActivePython-3.2/bin:$PATH
export LD_LIBRARY_PATH=/opt/ActivePython-3.2/lib:$LD_LIBRARY_PATH

/usr/local/pg93b3/bin/pg_ctl -D /usr/local/pg93b3/data/ start

-bash-4.1$ psql -p 4444
psql (9.3beta1)

Type "help" for help.

postgres=# create language plpython3u;
CREATE LANGUAGE

Legal… Ele criou o plpython3u com o ActivePython-3.2.

Se você quiser plpython2u também na mesma instalação. Não faça ajustes como fizemos para o ActivePython-3.2, apenas tenha uma cópia do ActivePython-2.7 e configure-a no caminho base e recompile a fonte.
export PATH=/opt/ActivePython-2.7/bin:$PATH
./configure --prefix=/usr/local/pg93b2 --with-python
make shared_libpython=yes
make shared_libpython=yes install


export PYTHONHOME=/opt/ActivePython-2.7/
export PYTHONPATH=/opt/ActivePython-2.7/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/pg93b2/lib
export LD_LIBRARY_PATH=/opt/ActivePython-2.7/lib:$LD_LIBRARY_PATH

-bash-4.1$ ./psql -p 4444
psql (9.3beta2)
Type "help" for help.

postgres=#
postgres=# create language plpython2u;
CREATE LANGUAGE

Comentários e correções são muito bem-vindos.