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
Før jeg studerede ovenstående fejl, læste jeg nedenstående PG-dokumentationslink om, hvordan PostgreSQL tillader at oprette sprog-plpython, og hvordan de skal konfigureres.
http://www.postgresql.org/docs/9.3/static/plpython-python23.html
Det er klart fra ovenstående link, at du skal kompilere den binære to gange, hvis du har brug for både plpython2u og plpython3u. AFAIK, ActivePython 2.7.x for plpython2u og 3.2.x for plpython3u kan konfigureres på PG 9.2.x uden problemer, men jeg har aldrig prøvet PG 9.3Beta2. Så da jeg overvejede at prøve og analysere fejlen om, hvorfor og hvordan den kunne repareres, begyndte jeg først at installere kilden ved at indstille basisstien med ActivePython 3.2. (ActivePython download link 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
Kompileringen mislykkedes og viste fejl i Config.log-filen som:
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'
I PG-dokumentation har vi klare anvisninger på ovenstående fejl og hvorfor det sker, plpython vil være et delt bibliotek på de fleste platforme, men på nogle platforme skal vi specifikt tvinge compileren som python fra delt bibliotek. Til det kan du enten fortsætte til /src/pl/python/Makefile for ændringer eller specifikt angive "shared_libpython=yes" under kompilering.
Kildekompilering undersøger for to filer, når du bruger -with-python, der er "python" og "python-config". Selvom jeg har ActivePython-3.2 i min basissti, kan compileren stadig ikke finde dem "python" og "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
Det er fordi filnavne i ActivePython 3.2 vil være "python" som "python3" og "python-config" som "python3-config", derfor pegede compiler på den gamle i stedet for den nye. På dette tidspunkt, Asif Naeem (Tak for din indsigt) fra vores kerneudvikler. Teamet gav mig besked om at håne eksisterende ActivePython-3.2-filer som python &python-config. Det er næsten som et hack fra ham, så jeg duplikerede disse filer som:
cd /opt/ActivePython-3.2/bin
cp python3-config python-config
cp python3 python
Ok, nu kan jeg se det i min grundsti.
[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
Jeg genkompilerede PG-kilde ved hjælp af -with-python efter ændringerne og tvang også compileren til at vælge SHARED_LIBPYTHON ved hjælp af "shared_libpython".
./configure --prefix=/usr/local/pg93b3 --with-python
make shared_libpython=yes
make shared_libpython=yes install
Disse trin vil effektivt kompilere PG9.3Beta med ActivePython-3.2-biblioteker. Lad os nu oprette sprog 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.
!>
!>
Ups, det er mærkeligt, hvorfor det er gået ned nu.. I denne form for situation er $PGDATA/pg_log dine venner til at få indsigt i problemet. Her er databaseserverens logoplysninger om nedbrud:
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
Okay. Jeg savnede at indstille python-stier, dette er meget vigtigt, når du arbejder med python- eller perl-sprog på din database.
Jeg har indstillet PYTHONHOME, PYTHONPATH &LD_LIBRARY_PATH, før du starter klyngen.
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
Dejligt... Det har skabt plpython3u med ActivePython-3.2.
Hvis du vil have plpython2u også på samme installation. Juster ikke, som vi gjorde for ActivePython-3.2, bare hav en kopi af ActivePython-2.7 og sæt den i basisstien og kompiler kilden igen.
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
Kommentarer og rettelser er meget velkomne.