Published on Mon, Jul 22, 2013
Above error described on PG mailing as it failes to CREATE LANGUAGE plpython2u/plpython3u on 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
Before doing some study on above errors I read below PG documentation link on how PostgreSQL permits to create langage plpython and how they should be configured.
Its clear from above link you need to compile the binary two time if you need both plpython2u & plpython3u. AFAIK, ActivePython 2.7.x for plpython2u and 3.2.x for plpython3u can be configured on PG 9.2.x without any difficulty, but I not ever gave a try on PG 9.3Beta2. So, considered to give a try and analyze the error about why and how it could be repaired, I first, begun source installation by setting base path with 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
Compilation has failed and showed error in Config.log file as:
make: 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: Leaving directory `/usr/local/src/postgresql-9.3beta1/src/pl/plpython'
In PG documentation we have clear directions on the above error and why it happen, plpython will be a shared library on most of the platforms, but on some platforms we need to specifically force the compiler as python from shared library. For that either you can proceed to /src/pl/python/Makefile for changes or specifically state “shared_libpython=yes” while compiling.
Source compilation examines for two files when you use –with-python that are “python” & “python-config”. Although I have ActivePython-3.2 in my base path, still compiler fails to find them “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
Its because, in ActivePython 3.2 file names will be, “python” as “python3” and “python-config” as “python3-config” therefore compiler pointed to old one instead to new. At this point, Asif Naeem (Thank you for your insight) from our core Dev. Team notfied me to mock existing ActivePython-3.2 files as python & python-config. Its nearly like a hack from him, so I duplicated those files as:
cd /opt/ActivePython-3.2/bin cp python3-config python-config cp python3 python
Ok, now I can see that in my base path.
[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
I recompiled PG source using –with-python after the alterations and also forcing the compiler to choose SHARED_LIBPYTHON using “shared_libpython”.
./configure --prefix=/usr/local/pg93b3 --with-python make shared_libpython=yes make shared_libpython=yes install
These steps will effectively compile PG9.3Beta with ActivePython-3.2 libraries. Now lets create language 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, this is strange, why it has crashed now.. In this kind of situation $PGDATA/pg_log are your friends to insight about the issue. Here’s the database server log information about crash:
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. I missed to set python paths, this is very important when you are
working with python or perl languages on your database.
I have set PYTHONHOME, PYTHONPATH & LD_LIBRARY_PATH before starting the 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
Nice…It has created plpython3u with ActivePython-3.2.
If you want plpython2u also on the same installation. Don’t tweak as we did for ActivePython-3.2, just have a copy of ActivePython-2.7 and set it in the base path and recompile the source.
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
Comments & Corrections are most welcomed.