Above error described on PG mailing as it failes to CREATE LANGUAGE plpython2u/plpython3u on PG9.3Beta.
http://www.postgresql.org/docs/9.3/static/plpython-python23.html
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)
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"
I have set PYTHONHOME, PYTHONPATH & LD_LIBRARY_PATH before starting the cluster.
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.
--Raghav
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 directoryBefore 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.
http://www.postgresql.org/docs/9.3/static/plpython-python23.html
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-pythonCompilation has failed and showed error in Config.log file as:
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'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-configIts 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 pythonOk, 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-configI 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 installThese 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 librariesOk. I missed to set python paths, this is very important when you are working with python or perl languages on your database.Could not find platform dependent libraries Consider setting $PYTHONHOME to [: ] Fatal Python error: Py_Initialize: Unable to get the locale encoding
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 LANGUAGENice...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 LANGUAGEComments & Corrections are most welcomed.
--Raghav
4 comments :
is possible in windows compile plpython2? for postgres 9.2/9.3
is possible in windows compile plpython2? for postgres 9.2/9.3
I never gave an attempt to try this on windows. Easily get time I sure try this out.
I recently read one blog, where Craig Ringer has made things simple on PG source compilation for Windows in his blog where he mentioned about Active perl similarly python should also work.
For your reference.
http://blog.2ndquadrant.com/easier-postgresql-builds-for-windows/
@ZaFhieL: you can view here: (perl language) http://www.mkyong.com/database/install-perl-in-postgresql-the-specified-module-could-not-be-found/
I have tested (PG 9.1). It's work fine.
Post a Comment