28

I am using cython to generate faster code for a mathematical model. I am having a hard time compiling the code, but somehow I managed to do so using a .bat:

setlocal EnableDelayedExpansion

CALL "C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\SetEnv.cmd" /x64 /release
set DISTUTILS_USE_SDK=1

C:\Python27\python.exe C:\gcsilve\trunk\myproject\myproject\cythonsetup.py build_ext --inplace

PAUSE

It runs ok...

My question is regarding pyximport. I have old code written by someone else that uses pyximport.install(). I couldn't figure out what it does and why I should use it, since I am already compiling the code by myself. So, can someone explain to me in a very simple (for dummies) way what pyximport does?

Additional information: I have a project1, using cython. I have a project2, that references project1.

ballade4op52
  • 2,142
  • 5
  • 27
  • 42
guilhermecgs
  • 2,913
  • 11
  • 39
  • 69

2 Answers2

22

pyximport is part of Cython, and it's used in place of import in a way.

If your module doesn’t require any extra C libraries or a special build setup, then you can use the pyximport module to load .pyx files directly on import, without having to write a setup.py file. It can be used like this:

>>> import pyximport; pyximport.install()
>>> import helloworld
Hello World

Straight from the Cython documentation

Adam Barthelson
  • 1,088
  • 1
  • 11
  • 20
8

You can use pyximport to automatically recompile and reload your .pyx module.

Remove what setup.py has generated, else you might load that extension module. pyximport does not use setup.py.

Let's assume a hello.pyx with a function mean2.

Start IPython.

In [1]: import pyximport
In [2]: pyximport.install(reload_support=True)
In [3]: from importlib import reload
In [4]: import hello
In [5]: hello.mean2(2,3)

The result:

Out [5]: 2.5

Leave that window and go to your editor to change hello.pyx.

Then go back to IPython and type

In [6]: reload(hello);import hello;hello.mean2(2,3)

You will see some text informing about the recompilation. Then the new result:

Out[6]: 'Mean of 2 and 3 is 2.5'
Roland Puntaier
  • 3,250
  • 30
  • 35