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.