How to compile cx_Oracle (python 3.2 for Windows x64)

I needed cx_Oracle 5.0.4 binaries for recently released python 3.2 for Windows x64. Since there were no binaries released for python 3.2, I built binaries myself.

Ingredients that you’ll need for cooking:

  • 64-bit Windows (I used Windows 2003 x64)
  • 64-bit python 3.2
  • 64-bit Oracle client of your choice (I build with both, 10g R2 and 11g R2)
  • Visual Studio 2008 Express (don’t be tempted to install VS 2010!!)
  • Windows SDK for Windows 2008 and .NET 3.5
  • Optionally: I used Virtual Clone Drive for conveniently mounting ISO images.

Note: Similarly, you can build 32-bit cx_Oracle, in that case you’ll use 32-bit Windows, 32-bit python 3.2 and 32-bit Oracle client. I’ll point to the difference when necessary.


0) Prepare Windows x64 (I used Windows 2003 x64 test machine)

1) Download Visual Studio Express 2008 with SP1 from Microsoft site

I downloaded VS2008ExpressWithSP1ENUX1504728.iso. I’ll let you to find the iso on Microsoft site for yourself!
Because Python 3.2 was built with VC 2008, you must use VS 2008 and not for example more recent version, VS 2010.

2) Install Visual C++ with default options

Note: When installing on x64, some components are installed in “Program Files (x86)” and some in “Program Files”.

3) Download Windows SDK for Windows 2008 and NET 3.5

I downloaded 6.0.6001.18000.367-KRMSDK_EN.iso.

4) Install SDK for Windows 2008 and NET 3.5 in default location

Note: I deselected Documentation and Samples to speedup the installation process.

5) Install 64-bit python 3.2 for Windows x64

Note: Alternatively, if you want to build 32-bit cx_Oracle binary, you must install 32-bit python 3.2.

6) Download cx_Oracle 5.0.4 tar file with the source

I downloaded cx_Oracle-5.0.4.tar.gz. Unzip in some temporary directory (D:\cx_Oracle)

7) Prepare command prompt for build


Start -> Run ->

If you're building on Windows x64:

%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars64.bat""

If you're building on x86:

%comspec% /k ""C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat""

set ORACLE_HOME=D:\ORACLE\ORA11R2\NETWORK\ADMIN
set PATH=D:\ORACLE\ORA11R2\BIN;C:\python32;%PATH%
set PYTHONHOME=D:\Python32

8) cd to temporary cx_Oracle directory

cd D:\cx_Oracle\cx_Oracle

cmd> python setup.py build

..this step wil create build directory with the build, you'll see something like this:

D:\cx_Oracle\cx_Oracle-5.0.4>dir build
Volume in drive D is SW
Volume Serial Number is B83A-326E

Directory of D:\cx_Oracle\cx_Oracle-5.0.4\build

04.03.2011 15:06 .
04.03.2011 15:06 ..
04.03.2011 15:06 lib.win-amd64-3.2-11g
04.03.2011 15:06 temp.win-amd64-3.2-11g
0 File(s) 0 bytes
4 Dir(s) 10.261.749.760 bytes free

Now you can install library with:


cmd> python setup.py install

You will see output simiral to this one:

D:\cx_Oracle\cx_Oracle-5.0.4>python setup.py install
running install
running build
running build_ext
running install_lib
copying build\lib.win-amd64-3.2-11g\cx_Oracle.pyd -> C:\python32\Lib\site-packages
running install_data
creating C:\python32\cx_Oracle-doc
copying BUILD.txt -> C:\python32\cx_Oracle-doc
copying LICENSE.TXT -> C:\python32\cx_Oracle-doc
copying README.TXT -> C:\python32\cx_Oracle-doc
copying HISTORY.txt -> C:\python32\cx_Oracle-doc
creating C:\python32\cx_Oracle-doc\html
copying html\connection.html -> C:\python32\cx_Oracle-doc\html
copying html\cursor.html -> C:\python32\cx_Oracle-doc\html
copying html\genindex.html -> C:\python32\cx_Oracle-doc\html
copying html\index.html -> C:\python32\cx_Oracle-doc\html
copying html\license.html -> C:\python32\cx_Oracle-doc\html
copying html\lob.html -> C:\python32\cx_Oracle-doc\html
copying html\modindex.html -> C:\python32\cx_Oracle-doc\html
copying html\module.html -> C:\python32\cx_Oracle-doc\html
copying html\objects.inv -> C:\python32\cx_Oracle-doc\html
copying html\search.html -> C:\python32\cx_Oracle-doc\html
copying html\searchindex.js -> C:\python32\cx_Oracle-doc\html
copying html\session_pool.html -> C:\python32\cx_Oracle-doc\html
copying html\subscription.html -> C:\python32\cx_Oracle-doc\html
copying html\variable.html -> C:\python32\cx_Oracle-doc\html
creating C:\python32\cx_Oracle-doc\html\_static
copying html\_static\basic.css -> C:\python32\cx_Oracle-doc\html\_static
copying html\_static\default.css -> C:\python32\cx_Oracle-doc\html\_static
copying html\_static\doctools.js -> C:\python32\cx_Oracle-doc\html\_static
copying html\_static\file.png -> C:\python32\cx_Oracle-doc\html\_static
copying html\_static\jquery.js -> C:\python32\cx_Oracle-doc\html\_static
copying html\_static\minus.png -> C:\python32\cx_Oracle-doc\html\_static
copying html\_static\plus.png -> C:\python32\cx_Oracle-doc\html\_static
copying html\_static\pygments.css -> C:\python32\cx_Oracle-doc\html\_static
copying html\_static\searchtools.js -> C:\python32\cx_Oracle-doc\html\_static
creating C:\python32\cx_Oracle-doc\samples
copying samples\DatabaseChangeNotification.py -> C:\python32\cx_Oracle-doc\samples
copying samples\DatabaseShutdown.py -> C:\python32\cx_Oracle-doc\samples
copying samples\DatabaseStartup.py -> C:\python32\cx_Oracle-doc\samples
copying samples\ReturnLongs.py -> C:\python32\cx_Oracle-doc\samples
copying samples\ReturnUnicode.py -> C:\python32\cx_Oracle-doc\samples
copying samples\RowsAsInstance.py -> C:\python32\cx_Oracle-doc\samples
creating C:\python32\cx_Oracle-doc\test
copying test\3kNumberVar.py -> C:\python32\cx_Oracle-doc\test
copying test\3kStringVar.py -> C:\python32\cx_Oracle-doc\test
copying test\Connection.py -> C:\python32\cx_Oracle-doc\test
copying test\Cursor.py -> C:\python32\cx_Oracle-doc\test
copying test\CursorVar.py -> C:\python32\cx_Oracle-doc\test
copying test\DateTimeVar.py -> C:\python32\cx_Oracle-doc\test
copying test\IntervalVar.py -> C:\python32\cx_Oracle-doc\test
copying test\LobVar.py -> C:\python32\cx_Oracle-doc\test
copying test\LongVar.py -> C:\python32\cx_Oracle-doc\test
copying test\NumberVar.py -> C:\python32\cx_Oracle-doc\test
copying test\ObjectVar.py -> C:\python32\cx_Oracle-doc\test
copying test\SessionPool.py -> C:\python32\cx_Oracle-doc\test
copying test\SetupTest.sql -> C:\python32\cx_Oracle-doc\test
copying test\StringVar.py -> C:\python32\cx_Oracle-doc\test
copying test\test.py -> C:\python32\cx_Oracle-doc\test
copying test\test3k.py -> C:\python32\cx_Oracle-doc\test
copying test\TestEnv.py -> C:\python32\cx_Oracle-doc\test
copying test\test_dbapi20.py -> C:\python32\cx_Oracle-doc\test
copying test\TimestampVar.py -> C:\python32\cx_Oracle-doc\test
copying test\uConnection.py -> C:\python32\cx_Oracle-doc\test
copying test\uCursor.py -> C:\python32\cx_Oracle-doc\test
copying test\uCursorVar.py -> C:\python32\cx_Oracle-doc\test
copying test\uDateTimeVar.py -> C:\python32\cx_Oracle-doc\test
copying test\uIntervalVar.py -> C:\python32\cx_Oracle-doc\test
copying test\uLobVar.py -> C:\python32\cx_Oracle-doc\test
copying test\uLongVar.py -> C:\python32\cx_Oracle-doc\test
copying test\UnicodeVar.py -> C:\python32\cx_Oracle-doc\test
copying test\uNumberVar.py -> C:\python32\cx_Oracle-doc\test
copying test\uObjectVar.py -> C:\python32\cx_Oracle-doc\test
copying test\uSessionPool.py -> C:\python32\cx_Oracle-doc\test
copying test\uStringVar.py -> C:\python32\cx_Oracle-doc\test
copying test\uTimestampVar.py -> C:\python32\cx_Oracle-doc\test
running install_egg_info
Writing C:\python32\Lib\site-packages\cx_Oracle-5.0.4-py3.2.egg-info

9) Test the build by importing cx_Oracle library


cmd> python

D:\cx_Oracle\cx_Oracle-5.0.4>python
Python 3.2 (r32:88445, Feb 20 2011, 21:30:00) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
>>>

Optionally, if you want to build cx_Oracle for 10g client (assuming you have
10g client installed on the same machine, simply change the home and run the build:


set ORACLE_HOME=D:\ORACLE\ORA10
set PATH=D:\ORACLE\ORA10\BIN;%PATH%

python setup.py build

and you’ll find two additional directories under build:


D:\cx_Oracle\cx_Oracle-5.0.4>dir build
Volume in drive D is SW
Volume Serial Number is B83A-326E

Directory of D:\cx_Oracle\cx_Oracle-5.0.4\build

04.03.2011 15:16 .
04.03.2011 15:16 ..
04.03.2011 15:13 bdist.win-amd64
04.03.2011 15:16 lib.win-amd64-3.2-10g
04.03.2011 15:06 lib.win-amd64-3.2-11g
04.03.2011 15:15 temp.win-amd64-3.2-10g
04.03.2011 15:06 temp.win-amd64-3.2-11g
0 File(s) 0 bytes
7 Dir(s) 10.260.930.560 bytes free

Happy cx_Oracle coding!

Posted on 06.03.2011, in Scripting and tagged , , . Bookmark the permalink. 2 Comments.

  1. Building cx_Oracle with Oracle Instant Client
    Just a reminder, if you wish to compile cx_Oracle with Oracle instant client, then make sure that you download sdk zip file in addition to basic one. For example, if you wish to build cx_Oracle with OIC 11.2.0.1, you’ll need:

    instantclient-basic-win-x86-64-11.2.0.1.0.zip
    instantclient-sdk-win-x86-64-11.2.0.1.0.zip

    and optionally (but recommended):

    instantclient-sqlplus-win-x86-64-11.2.0.1.0.zip

  2. How to manually install cx_Oracle module
    If you want to install cx_Oracle module manually, simply copy the necessary files to python home.

    SET PYTHONHOME=E:\Python32

    md %PYTHONHOME%\cx_Oracle-doc
    --
    -- cd to the directory with the cx_Oracle build
    --
    xcopy /E /S /I cx_Oracle-doc\html %PYTHONHOME%\cx_Oracle-doc\html
    xcopy /E /S /I cx_Oracle-doc\samples %PYTHONHOME%\cx_Oracle-doc\samples
    xcopy /E /S /I cx_Oracle-doc\test %PYTHONHOME%\cx_Oracle-doc\test

    xcopy /E /S lib.win32-3.2-10g\cx_Oracle.pyd %PYTHONHOME%\Lib\site-packages
    --
    -- I placed a copy of egg-info file in root directory of the build
    --
    xcopy cx_Oracle-5.0.4-py3.2.egg-info %PYTHONHOME%\Lib\site-packages