PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

ERRORE:impossibile accedere al file “$libdir/plpython2” – ERRORE:impossibile accedere al file “$libdir/plpython3”

Sopra l'errore descritto sull'invio di PG in quanto non riesce a CREATE LANGUAGE plpython2u/plpython3u su 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

Prima di fare qualche studio sugli errori di cui sopra ho letto sotto il link alla documentazione PG su come PostgreSQL permette di creare langage plpython e come dovrebbero essere configurati.

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

È chiaro dal collegamento sopra che devi compilare il binario due volte se hai bisogno sia di plpython2u che di plpython3u. AFAIK, ActivePython 2.7.x per plpython2u e 3.2.x per plpython3u possono essere configurati su PG 9.2.x senza alcuna difficoltà, ma non ho mai provato PG 9.3Beta2. Quindi, considerato di provare ad analizzare l'errore sul perché e come potrebbe essere riparato, per prima cosa, ho iniziato l'installazione del sorgente impostando il percorso di base con ActivePython 3.2. (Link per il download di 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

La compilazione non è riuscita e ha mostrato un errore nel file Config.log come:

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'

Nella documentazione di PG abbiamo indicazioni chiare sull'errore di cui sopra e sul perché si verifica, plpython sarà una libreria condivisa sulla maggior parte delle piattaforme, ma su alcune piattaforme è necessario forzare specificamente il compilatore come python dalla libreria condivisa. Per questo puoi procedere a /src/pl/python/Makefile per le modifiche o dichiarare in modo specifico "shared_libpython=yes" durante la compilazione.

La compilazione del codice sorgente esamina due file quando usi –with-python che sono "python" e "python-config". Anche se ho ActivePython-3.2 nel mio percorso di base, il compilatore non riesce a trovarli "python" e "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

È perché, in ActivePython 3.2 i nomi dei file saranno "python" come "python3" e "python-config" come "python3-config", quindi il compilatore ha puntato a quello vecchio anziché a quello nuovo. A questo punto, Asif Naeem (Grazie per la tua intuizione) dal nostro core Dev. Il team mi ha notificato di deridere i file ActivePython-3.2 esistenti come python e python-config. È quasi come un hack da parte sua, quindi ho duplicato quei file come:

cd /opt/ActivePython-3.2/bin
cp python3-config python-config
cp python3 python

Ok, ora posso vederlo nel mio percorso di 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

Ho ricompilato il sorgente PG usando –with-python dopo le modifiche e costringendo anche il compilatore a scegliere SHARED_LIBPYTHON usando "shared_libpython".

./configure --prefix=/usr/local/pg93b3 --with-python
make shared_libpython=yes
make shared_libpython=yes install

Questi passaggi compileranno efficacemente PG9.3Beta con le librerie ActivePython-3.2. Ora creiamo la lingua 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, questo è strano, perché ora si è bloccato.. In questo tipo di situazione $PGDATA/pg_log sono i tuoi amici per approfondire il problema. Ecco le informazioni di registro del server di database sull'arresto anomalo:

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. Mi è mancato impostare i percorsi python, questo è molto importante quando lavori con linguaggi python o perl sul tuo database.
Ho impostato PYTHONHOME, PYTHONPATH e LD_LIBRARY_PATH prima di avviare il 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

Bello... Ha creato plpython3u con ActivePython-3.2.

Se vuoi plpython2u anche sulla stessa installazione. Non modificare come abbiamo fatto per ActivePython-3.2, basta avere una copia di ActivePython-2.7 e impostarlo nel percorso di base e ricompilare il sorgente.

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

Commenti e correzioni sono i benvenuti.