Skip to content

Instantly share code, notes, and snippets.

@nextman
Created March 6, 2016 10:19
Show Gist options
  • Save nextman/fd4bbbc80514c455cdb3 to your computer and use it in GitHub Desktop.
Save nextman/fd4bbbc80514c455cdb3 to your computer and use it in GitHub Desktop.
Установка python cx_Oracle в MacOS X 10

Задача: получить доступ к ораклу из python в Mac OS X.

Скачиваем (на момент написания статьи - отсюда) последние версии instantclient-basic под архитектуры x32 и x64, а также instantclient-sdk под любую платформу - они одинаковые.

Непонятно, что помешало ораклу сделать под Mac OS X universal binary, но раз уж штатный python у нас universal:

file /usr/bin/python

сделаем, пожалуй, oracle instant client под x32 и x64.

Итак,

mkdir -p ~/tmp/ora
cp ~/Downloads/instantclient-* ~/tmp/ora/

cd ~/tmp/ora/
ls -1

instantclient-basic-macos.x32-11.2.0.4.0.zip
instantclient-basic-macos.x64-11.2.0.4.0.zip
instantclient-sdk-macos.x32-11.2.0.4.0.zip

Распаковываем x64 и x32 в разные каталоги, создаем каталог для universal и собственно склеиваем исполняемые файлы и библиотеки:

cd ~/tmp/ora/

unzip instantclient-basic-macos.x32-11.2.0.4.0.zip -d ./32
unzip instantclient-basic-macos.x64-11.2.0.4.0.zip -d ./64

mkdir universal

find ./32/instantclient_11_2 -perm +111 -type f -exec basename {} \; | xargs -n 1 sh -c 'lipo -create -arch i386 ./32/instantclient_11_2/$0 -arch x86_64 ./64/instantclient_11_2/$0 -output ./universal/$0'

Туда же копируем неисполняемые файлы, распаковываем sdk и переносим туда же.

find ./32/instantclient_11_2 -type f ! -perm +111 -exec cp {} ./universal/ \;
unzip instantclient-sdk-macos.x32-11.2.0.4.0.zip 
mv ./instantclient_11_2/sdk ./universal/

Удаляем лишнее, делаем симлинки на библиотеки без версии в названии.

rm -rf ./32 ./64 ./instantclient*

cd universal/
ln -s libclntsh.dylib.11.1 libclntsh.dylib
ln -s libocci.dylib.11.1 libocci.dylib
cd ..

Готово. В каталоге universal у нас лежит oracle instant client universal binary.

Осталось поставить cx_Oracle. Я буду делать это в виртуальном окружении.

mkvirtualenv -p /usr/bin/python ora
mv universal ~/.virtualenvs/ora/lib/oracle

export ORACLE_HOME=~/.virtualenvs/ora/lib/oracle
export DYLD_LIBRARY_PATH=$ORACLE_HOME
export LD_LIBRARY_PATH=$ORACLE_HOME

pip install cx_Oracle

Проверяем:

file ~/.virtualenvs/o2/lib/python2.7/site-packages/cx_Oracle.so

~/.virtualenvs/ora/lib/python2.7/site-packages/cx_Oracle.so: Mach-O universal binary with 2 architectures
~/.virtualenvs/ora/lib/python2.7/site-packages/cx_Oracle.so (for architecture x86_64):  Mach-O 64-bit bundle x86_64
~/.virtualenvs/ora/lib/python2.7/site-packages/cx_Oracle.so (for architecture i386):    Mach-O bundle i386

Все. Хотя нет, не все - каталог, где лежат оракловые библиотеки, должен быть известен в том окружении, в котором запускается python. Будем считать это заданием на дом.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment