<html>
<head>
<title>SWIG:Examples:python:simple</title>
</head>

<body bgcolor="#ffffff">


<tt>SWIG/Examples/python/simple/</tt>
<hr>

<H2>Simple Python Example</H2>

<p>
This example illustrates how you can hook Python to a very simple C program containing
a function and a global variable.

<h2>The C Code</h2>

Suppose you have the following C code:

<blockquote>
<pre>
/* File : example.c */

/* A global variable */
double Foo = 3.0;

/* Compute the greatest common divisor of positive integers */
int gcd(int x, int y) {
  int g;
  g = y;
  while (x &gt; 0) {
    g = x;
    x = y % x;
    y = g;
  }
  return g;
}
</pre>
</blockquote>

<h2>The SWIG interface</h2>

Here is a simple SWIG interface file:

<blockquote>
<pre>
/* File: example.i */
%module example

extern int gcd(int x, int y);
extern double Foo;
</pre>
</blockquote>

<h2>Compilation</h2>

<ol>
<li><tt>swig -python <a href="example.i">example.i</a></tt>
<p>
<li>Compile <tt><a href="example_wrap.c">example_wrap.c</a></tt> and <tt><a href="example.c">example.c</a></tt>
to create the extension <tt>examplemodule.so</tt>. 
</ol>

<h2>Using the extension</h2>

Click <a href="runme.py">here</a> to see a script that calls our C functions from Python.

<h2>Key points</h2>

<ul>
<li>Use the <tt>import</tt> statement to load your extension module from Python. For example:
<blockquote>
<pre>
import example
</pre>
</blockquote>

<li>C functions work just like Python functions. For example:
<blockquote>
<pre>
g = example.gcd(42,105)
</pre>
</blockquote>

<li>C global variables are accessed through a special variable called 'cvar'. For example:
<blockquote>
<pre>
a = example.cvar.Foo
</pre>
</blockquote>
</ul>

<hr>
</body>
</html>
