sql >> Databáze >  >> RDS >> PostgreSQL

CHYBA:Nelze získat přístup k souboru „$libdir/plpython2“ – CHYBA:Nelze získat přístup k souboru „$libdir/plpython3“

Výše uvedená chyba popsaná u PG mailingu, protože selže VYTVOŘIT JAZYK plpython2u/plpython3u na 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

Než jsem provedl nějakou studii o výše uvedených chybách, přečetl jsem si níže odkaz na dokumentaci PG o tom, jak PostgreSQL umožňuje vytvářet jazyk plpython a jak by měly být konfigurovány.

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

Z výše uvedeného odkazu je jasné, že musíte binární soubor zkompilovat dvakrát, pokud potřebujete plpython2u i plpython3u. AFAIK, ActivePython 2.7.x pro plpython2u a 3.2.x pro plpython3u lze na PG 9.2.x nakonfigurovat bez jakýchkoli potíží, ale PG 9.3Beta2 jsem nikdy nezkusil. Takže, zvažován pokusit se analyzovat chybu o tom, proč a jak by mohla být opravena, jsem nejprve zahájil instalaci zdroje nastavením základní cesty pomocí ActivePython 3.2. (Odkaz ke stažení ActivePythonu 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

Kompilace se nezdařila a v souboru Config.log se zobrazila chyba jako:

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'

V dokumentaci PG máme jasné pokyny k výše uvedené chybě a proč k ní dochází, plpython bude sdílená knihovna na většině platforem, ale na některých platformách musíme konkrétně vynutit kompilátor jako python ze sdílené knihovny. Za tímto účelem můžete buď přistoupit ke změnám v /src/pl/python/Makefile, nebo při kompilaci konkrétně uvést „shared_libpython=yes“.

Zdrojová kompilace zkoumá dva soubory, když použijete –with-python, které jsou „python“ a „python-config“. Přestože mám ve své základní cestě ActivePython-3.2, kompilátor je stále nedokáže najít „python“ a „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

Je to proto, že v ActivePythonu 3.2 budou názvy souborů „python“ jako „python3“ a „python-config“ jako „python3-config“, proto kompilátor ukázal na starý místo na nový. V tomto okamžiku Asif Naeem (Děkujeme za váš názor) od našeho základního Dev. Tým mi oznámil, že zesměšňuji existující soubory ActivePython-3.2 jako python &python-config. Je to skoro jako hack od něj, takže jsem tyto soubory duplikoval jako:

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

Dobře, teď to vidím na své základní cestě.

[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

Po úpravách jsem znovu zkompiloval zdroj PG pomocí –with-python a také jsem přinutil kompilátor, aby zvolil SHARED_LIBPYTHON pomocí „shared_libpython“.

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

Tyto kroky efektivně zkompilují PG9.3Beta s knihovnami ActivePython-3.2. Nyní vytvoříme jazyk 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.
!>
!>

Jejda, to je divné, proč se to teď zhroutilo.. V takové situaci jsou $PGDATA/pg_log vaši přátelé, aby se o problému dozvěděli. Zde jsou informace protokolu databázového serveru o selhání:

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. Zapomněl jsem nastavit cesty pythonu, to je velmi důležité, když ve své databázi pracujete s jazyky python nebo perl.
Před spuštěním clusteru jsem nastavil PYTHONHOME, PYTHONPATH &LD_LIBRARY_PATH.

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

Pěkné… Vytvořil plpython3u s ActivePython-3.2.

Pokud chcete plpython2u také na stejné instalaci. Neupravujte jako u ActivePython-3.2, stačí mít kopii ActivePython-2.7 a nastavit ji do základní cesty a znovu zkompilovat zdroj.

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

Komentáře a opravy jsou velmi vítány.


  1. Importujte data do databáze MySQL

  2. Jak povolím MSDTC na SQL Server?

  3. ORA-01031:nedostatečná oprávnění při výběru pohledu

  4. Vraťte řádky, které obsahují nealfanumerické znaky na serveru SQL