You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
732 lines
52 KiB
732 lines
52 KiB
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
|
|
<title>Using SIP — SIP 4.10.5 Reference Guide</title>
|
|
<link rel="stylesheet" href="_static/default.css" type="text/css" />
|
|
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
|
<script type="text/javascript">
|
|
var DOCUMENTATION_OPTIONS = {
|
|
URL_ROOT: '#',
|
|
VERSION: '4.10.5',
|
|
COLLAPSE_MODINDEX: false,
|
|
FILE_SUFFIX: '.html',
|
|
HAS_SOURCE: true
|
|
};
|
|
</script>
|
|
<script type="text/javascript" src="_static/jquery.js"></script>
|
|
<script type="text/javascript" src="_static/doctools.js"></script>
|
|
<link rel="top" title="SIP 4.10.5 Reference Guide" href="index.html" />
|
|
<link rel="next" title="The SIP Command Line" href="command_line.html" />
|
|
<link rel="prev" title="Installation" href="installation.html" />
|
|
</head>
|
|
<body>
|
|
<div class="related">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="genindex.html" title="General Index"
|
|
accesskey="I">index</a></li>
|
|
<li class="right" >
|
|
<a href="modindex.html" title="Global Module Index"
|
|
accesskey="M">modules</a> |</li>
|
|
<li class="right" >
|
|
<a href="command_line.html" title="The SIP Command Line"
|
|
accesskey="N">next</a> |</li>
|
|
<li class="right" >
|
|
<a href="installation.html" title="Installation"
|
|
accesskey="P">previous</a> |</li>
|
|
<li><a href="index.html">SIP 4.10.5 Reference Guide</a> »</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="document">
|
|
<div class="documentwrapper">
|
|
<div class="bodywrapper">
|
|
<div class="body">
|
|
|
|
<div class="section" id="using-sip">
|
|
<span id="ref-using"></span><h1>Using SIP<a class="headerlink" href="#using-sip" title="Permalink to this headline">¶</a></h1>
|
|
<p>Bindings are generated by the SIP code generator from a number of specification
|
|
files, typically with a <tt class="docutils literal"><span class="pre">.sip</span></tt> extension. Specification files look very
|
|
similar to C and C++ header files, but often with additional information (in
|
|
the form of a <em>directive</em> or an <em>annotation</em>) and code so that the bindings
|
|
generated can be finely tuned.</p>
|
|
<div class="section" id="a-simple-c-example">
|
|
<span id="ref-simple-c-example"></span><h2>A Simple C++ Example<a class="headerlink" href="#a-simple-c-example" title="Permalink to this headline">¶</a></h2>
|
|
<p>We start with a simple example. Let’s say you have a (fictional) C++ library
|
|
that implements a single class called <tt class="docutils literal"><span class="pre">Word</span></tt>. The class has one constructor
|
|
that takes a <tt class="docutils literal"><span class="pre">\0</span></tt> terminated character string as its single argument. The
|
|
class has one method called <tt class="docutils literal"><span class="pre">reverse()</span></tt> which takes no arguments and returns
|
|
a <tt class="docutils literal"><span class="pre">\0</span></tt> terminated character string. The interface to the class is defined in
|
|
a header file called <tt class="docutils literal"><span class="pre">word.h</span></tt> which might look something like this:</p>
|
|
<div class="highlight-python"><pre>// Define the interface to the word library.
|
|
|
|
class Word {
|
|
const char *the_word;
|
|
|
|
public:
|
|
Word(const char *w);
|
|
|
|
char *reverse() const;
|
|
};</pre>
|
|
</div>
|
|
<p>The corresponding SIP specification file would then look something like this:</p>
|
|
<div class="highlight-python"><pre>// Define the SIP wrapper to the word library.
|
|
|
|
%Module word 0
|
|
|
|
class Word {
|
|
|
|
%TypeHeaderCode
|
|
#include <word.h>
|
|
%End
|
|
|
|
public:
|
|
Word(const char *w);
|
|
|
|
char *reverse() const;
|
|
};</pre>
|
|
</div>
|
|
<p>Obviously a SIP specification file looks very much like a C++ (or C) header
|
|
file, but SIP does not include a full C++ parser. Let’s look at the
|
|
differences between the two files.</p>
|
|
<blockquote>
|
|
<ul class="simple">
|
|
<li>The <a class="reference external" href="directives.html#directive-%Module"><tt class="xref docutils literal"><span class="pre">%Module</span></tt></a> directive has been added <a class="footnote-reference" href="#id4" id="id1">[1]</a>. This is used to
|
|
name the Python module that is being created and to give it a
|
|
<em>generation</em> number. In this example these are <tt class="docutils literal"><span class="pre">word</span></tt> and <tt class="docutils literal"><span class="pre">0</span></tt>
|
|
respectively. The generation number is effectively the version number of
|
|
the module.</li>
|
|
<li>The <a class="reference external" href="directives.html#directive-%TypeHeaderCode"><tt class="xref docutils literal"><span class="pre">%TypeHeaderCode</span></tt></a> directive has been added. The text
|
|
between this and the following <a class="reference external" href="directives.html#directive-%End"><tt class="xref docutils literal"><span class="pre">%End</span></tt></a> directive is included
|
|
literally in the code that SIP generates. Normally it is used, as in
|
|
this case, to <tt class="docutils literal"><span class="pre">#include</span></tt> the corresponding C++ (or C) header file <a class="footnote-reference" href="#id5" id="id2">[2]</a>.</li>
|
|
<li>The declaration of the private variable <tt class="docutils literal"><span class="pre">this_word</span></tt> has been removed.
|
|
SIP does not support access to either private or protected instance
|
|
variables.</li>
|
|
</ul>
|
|
</blockquote>
|
|
<p>If we want to we can now generate the C++ code in the current directory by
|
|
running the following command:</p>
|
|
<div class="highlight-python"><div class="highlight"><pre><span class="n">sip</span> <span class="o">-</span><span class="n">c</span> <span class="o">.</span> <span class="n">word</span><span class="o">.</span><span class="n">sip</span>
|
|
</pre></div>
|
|
</div>
|
|
<p>However, that still leaves us with the task of compiling the generated code and
|
|
linking it against all the necessary libraries. It’s much easier to use the
|
|
<a class="reference external" href="build_system.html#ref-build-system"><em>SIP build system</em></a> to do the whole thing.</p>
|
|
<p>Using the SIP build system is simply a matter of writing a small Python script.
|
|
In this simple example we will assume that the <tt class="docutils literal"><span class="pre">word</span></tt> library we are wrapping
|
|
and it’s header file are installed in standard system locations and will be
|
|
found by the compiler and linker without having to specify any additional
|
|
flags. In a more realistic example your Python script may take command line
|
|
options, or search a set of directories to deal with different configurations
|
|
and installations.</p>
|
|
<p>This is the simplest script (conventionally called <tt class="docutils literal"><span class="pre">configure.py</span></tt>):</p>
|
|
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">os</span>
|
|
<span class="kn">import</span> <span class="nn">sipconfig</span>
|
|
|
|
<span class="c"># The name of the SIP build file generated by SIP and used by the build</span>
|
|
<span class="c"># system.</span>
|
|
<span class="n">build_file</span> <span class="o">=</span> <span class="s">"word.sbf"</span>
|
|
|
|
<span class="c"># Get the SIP configuration information.</span>
|
|
<span class="n">config</span> <span class="o">=</span> <span class="n">sipconfig</span><span class="o">.</span><span class="n">Configuration</span><span class="p">()</span>
|
|
|
|
<span class="c"># Run SIP to generate the code.</span>
|
|
<span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s">" "</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">config</span><span class="o">.</span><span class="n">sip_bin</span><span class="p">,</span> <span class="s">"-c"</span><span class="p">,</span> <span class="s">"."</span><span class="p">,</span> <span class="s">"-b"</span><span class="p">,</span> <span class="n">build_file</span><span class="p">,</span> <span class="s">"word.sip"</span><span class="p">]))</span>
|
|
|
|
<span class="c"># Create the Makefile.</span>
|
|
<span class="n">makefile</span> <span class="o">=</span> <span class="n">sipconfig</span><span class="o">.</span><span class="n">SIPModuleMakefile</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">build_file</span><span class="p">)</span>
|
|
|
|
<span class="c"># Add the library we are wrapping. The name doesn't include any platform</span>
|
|
<span class="c"># specific prefixes or extensions (e.g. the "lib" prefix on UNIX, or the</span>
|
|
<span class="c"># ".dll" extension on Windows).</span>
|
|
<span class="n">makefile</span><span class="o">.</span><span class="n">extra_libs</span> <span class="o">=</span> <span class="p">[</span><span class="s">"word"</span><span class="p">]</span>
|
|
|
|
<span class="c"># Generate the Makefile itself.</span>
|
|
<span class="n">makefile</span><span class="o">.</span><span class="n">generate</span><span class="p">()</span>
|
|
</pre></div>
|
|
</div>
|
|
<p>Hopefully this script is self-documenting. The key parts are the
|
|
<tt class="docutils literal"><span class="pre">Configuration</span></tt> and <tt class="docutils literal"><span class="pre">SIPModuleMakefile</span></tt> classes. The build system contains
|
|
other Makefile classes, for example to build programs or to call other
|
|
Makefiles in sub-directories.</p>
|
|
<p>After running the script (using the Python interpreter the extension module is
|
|
being created for) the generated C++ code and <tt class="docutils literal"><span class="pre">Makefile</span></tt> will be in the
|
|
current directory.</p>
|
|
<p>To compile and install the extension module, just run the following
|
|
commands <a class="footnote-reference" href="#id6" id="id3">[3]</a>:</p>
|
|
<div class="highlight-python"><pre>make
|
|
make install</pre>
|
|
</div>
|
|
<p>That’s all there is to it.</p>
|
|
<p>See <a class="reference external" href="distutils.html#ref-distutils"><em>Building Your Extension with distutils</em></a> for an example of how to build this example using
|
|
distutils.</p>
|
|
<table class="docutils footnote" frame="void" id="id4" rules="none">
|
|
<colgroup><col class="label" /><col /></colgroup>
|
|
<tbody valign="top">
|
|
<tr><td class="label"><a class="fn-backref" href="#id1">[1]</a></td><td>All SIP directives start with a <tt class="docutils literal"><span class="pre">%</span></tt> as the first non-whitespace
|
|
character of a line.</td></tr>
|
|
</tbody>
|
|
</table>
|
|
<table class="docutils footnote" frame="void" id="id5" rules="none">
|
|
<colgroup><col class="label" /><col /></colgroup>
|
|
<tbody valign="top">
|
|
<tr><td class="label"><a class="fn-backref" href="#id2">[2]</a></td><td>SIP includes many code directives like this. They differ in where the
|
|
supplied code is placed by SIP in the generated code.</td></tr>
|
|
</tbody>
|
|
</table>
|
|
<table class="docutils footnote" frame="void" id="id6" rules="none">
|
|
<colgroup><col class="label" /><col /></colgroup>
|
|
<tbody valign="top">
|
|
<tr><td class="label"><a class="fn-backref" href="#id3">[3]</a></td><td>On Windows you might run <tt class="docutils literal"><span class="pre">nmake</span></tt> or <tt class="docutils literal"><span class="pre">mingw32-make</span></tt> instead.</td></tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div class="section" id="id7">
|
|
<h2>A Simple C Example<a class="headerlink" href="#id7" title="Permalink to this headline">¶</a></h2>
|
|
<p>Let’s now look at a very similar example of wrapping a fictional C library:</p>
|
|
<div class="highlight-python"><pre>/* Define the interface to the word library. */
|
|
|
|
struct Word {
|
|
const char *the_word;
|
|
};
|
|
|
|
struct Word *create_word(const char *w);
|
|
char *reverse(struct Word *word);</pre>
|
|
</div>
|
|
<p>The corresponding SIP specification file would then look something like this:</p>
|
|
<div class="highlight-python"><pre>/* Define the SIP wrapper to the word library. */
|
|
|
|
%CModule word 0
|
|
|
|
struct Word {
|
|
|
|
%TypeHeaderCode
|
|
#include <word.h>
|
|
%End
|
|
|
|
const char *the_word;
|
|
};
|
|
|
|
struct Word *create_word(const char *w) /Factory/;
|
|
char *reverse(struct Word *word);</pre>
|
|
</div>
|
|
<p>Again, let’s look at the differences between the two files.</p>
|
|
<blockquote>
|
|
<ul class="simple">
|
|
<li>The <a class="reference external" href="directives.html#directive-%CModule"><tt class="xref docutils literal"><span class="pre">%CModule</span></tt></a> directive has been added. This has the same
|
|
syntax as the <a class="reference external" href="directives.html#directive-%Module"><tt class="xref docutils literal"><span class="pre">%Module</span></tt></a> directive used in the previous example
|
|
but tells SIP that the library being wrapped is implemented in C rather
|
|
than C++.</li>
|
|
<li>The <a class="reference external" href="directives.html#directive-%TypeHeaderCode"><tt class="xref docutils literal"><span class="pre">%TypeHeaderCode</span></tt></a> directive has been added.</li>
|
|
<li>The <a class="reference external" href="annotations.html#fanno-Factory"><tt class="xref docutils literal"><span class="pre">Factory</span></tt></a> annotation has been added to the <tt class="docutils literal"><span class="pre">create_word()</span></tt>
|
|
function. This tells SIP that a newly created structure is being
|
|
returned and it is owned by Python.</li>
|
|
</ul>
|
|
</blockquote>
|
|
<p>The <tt class="docutils literal"><span class="pre">configure.py</span></tt> build system script described in the previous example can
|
|
be used for this example without change.</p>
|
|
</div>
|
|
<div class="section" id="a-more-complex-c-example">
|
|
<h2>A More Complex C++ Example<a class="headerlink" href="#a-more-complex-c-example" title="Permalink to this headline">¶</a></h2>
|
|
<p>In this last example we will wrap a fictional C++ library that contains a class
|
|
that is derived from a TQt class. This will demonstrate how SIP allows a class
|
|
hierarchy to be split across multiple Python extension modules, and will
|
|
introduce SIP’s versioning system.</p>
|
|
<p>The library contains a single C++ class called <tt class="docutils literal"><span class="pre">Hello</span></tt> which is derived from
|
|
TQt’s <tt class="docutils literal"><span class="pre">TQLabel</span></tt> class. It behaves just like <tt class="docutils literal"><span class="pre">TQLabel</span></tt> except that the text
|
|
in the label is hard coded to be <tt class="docutils literal"><span class="pre">Hello</span> <span class="pre">World</span></tt>. To make the example more
|
|
interesting we’ll also say that the library only supports TQt v4.2 and later,
|
|
and also includes a function called <tt class="docutils literal"><span class="pre">setDefault()</span></tt> that is not implemented
|
|
in the Windows version of the library.</p>
|
|
<p>The <tt class="docutils literal"><span class="pre">hello.h</span></tt> header file looks something like this:</p>
|
|
<div class="highlight-python"><pre>// Define the interface to the hello library.
|
|
|
|
#include <qlabel.h>
|
|
#include <qwidget.h>
|
|
#include <qstring.h>
|
|
|
|
class Hello : public TQLabel {
|
|
// This is needed by the TQt Meta-Object Compiler.
|
|
Q_OBJECT
|
|
TQ_OBJECT
|
|
|
|
public:
|
|
Hello(TQWidget *parent = 0);
|
|
|
|
private:
|
|
// Prevent instances from being copied.
|
|
Hello(const Hello &);
|
|
Hello &operator=(const Hello &);
|
|
};
|
|
|
|
#if !defined(Q_OS_WIN)
|
|
void setDefault(const TQString &def);
|
|
#endif</pre>
|
|
</div>
|
|
<p>The corresponding SIP specification file would then look something like this:</p>
|
|
<div class="highlight-python"><pre>// Define the SIP wrapper to the hello library.
|
|
|
|
%Module hello 0
|
|
|
|
%Import TQtGui/TQtGuimod.sip
|
|
|
|
%If (TQt_4_2_0 -)
|
|
|
|
class Hello : TQLabel {
|
|
|
|
%TypeHeaderCode
|
|
#include <hello.h>
|
|
%End
|
|
|
|
public:
|
|
Hello(TQWidget *parent /TransferThis/ = 0);
|
|
|
|
private:
|
|
Hello(const Hello &);
|
|
};
|
|
|
|
%If (!WS_WIN)
|
|
void setDefault(const TQString &def);
|
|
%End
|
|
|
|
%End</pre>
|
|
</div>
|
|
<p>Again we look at the differences, but we’ll skip those that we’ve looked at in
|
|
previous examples.</p>
|
|
<blockquote>
|
|
<ul class="simple">
|
|
<li>The <a class="reference external" href="directives.html#directive-%Import"><tt class="xref docutils literal"><span class="pre">%Import</span></tt></a> directive has been added to specify that we are
|
|
extending the class hierarchy defined in the file <tt class="docutils literal"><span class="pre">TQtGui/TQtGuimod.sip</span></tt>.
|
|
This file is part of PyTQt. The build system will take care of finding
|
|
the file’s exact location.</li>
|
|
<li>The <a class="reference external" href="directives.html#directive-%If"><tt class="xref docutils literal"><span class="pre">%If</span></tt></a> directive has been added to specify that everything
|
|
<a class="footnote-reference" href="#id11" id="id8">[4]</a> up to the matching <a class="reference external" href="directives.html#directive-%End"><tt class="xref docutils literal"><span class="pre">%End</span></tt></a> directive only applies to TQt
|
|
v4.2 and later. <tt class="docutils literal"><span class="pre">TQt_4_2_0</span></tt> is a <em>tag</em> defined in <tt class="docutils literal"><span class="pre">TQtCoremod.sip</span></tt>
|
|
<a class="footnote-reference" href="#id12" id="id9">[5]</a> using the <a class="reference external" href="directives.html#directive-%Timeline"><tt class="xref docutils literal"><span class="pre">%Timeline</span></tt></a> directive. <a class="reference external" href="directives.html#directive-%Timeline"><tt class="xref docutils literal"><span class="pre">%Timeline</span></tt></a>
|
|
is used to define a tag for each version of a library’s API you are
|
|
wrapping allowing you to maintain all the different versions in a single
|
|
SIP specification. The build system provides support to <tt class="docutils literal"><span class="pre">configure.py</span></tt>
|
|
scripts for working out the correct tags to use according to which
|
|
version of the library is actually installed.</li>
|
|
<li>The <tt class="docutils literal"><span class="pre">public</span></tt> keyword used in defining the super-classes has been
|
|
removed. This is not supported by SIP.</li>
|
|
<li>The <a class="reference external" href="annotations.html#aanno-TransferThis"><tt class="xref docutils literal"><span class="pre">TransferThis</span></tt></a> annotation has been added to the constructor’s
|
|
argument. It specifies that if the argument is not 0 (i.e. the <tt class="docutils literal"><span class="pre">Hello</span></tt>
|
|
instance being constructed has a parent) then ownership of the instance
|
|
is transferred from Python to C++. It is needed because TQt maintains
|
|
objects (i.e. instances derived from the <tt class="docutils literal"><span class="pre">TQObject</span></tt> class) in a
|
|
hierachy. When an object is destroyed all of its children are also
|
|
automatically destroyed. It is important, therefore, that the Python
|
|
garbage collector doesn’t also try and destroy them. This is covered in
|
|
more detail in <a class="reference internal" href="#ref-object-ownership"><em>Ownership of Objects</em></a>. SIP provides many other
|
|
annotations that can be applied to arguments, functions and classes.
|
|
Multiple annotations are separated by commas. Annotations may have
|
|
values.</li>
|
|
<li>The <tt class="docutils literal"><span class="pre">=</span></tt> operator has been removed. This operator is not supported by
|
|
SIP.</li>
|
|
<li>The <a class="reference external" href="directives.html#directive-%If"><tt class="xref docutils literal"><span class="pre">%If</span></tt></a> directive has been added to specify that everything
|
|
up to the matching <a class="reference external" href="directives.html#directive-%End"><tt class="xref docutils literal"><span class="pre">%End</span></tt></a> directive does not apply to Windows.
|
|
<tt class="docutils literal"><span class="pre">WS_WIN</span></tt> is another tag defined by PyTQt, this time using the
|
|
<a class="reference external" href="directives.html#directive-%Platforms"><tt class="xref docutils literal"><span class="pre">%Platforms</span></tt></a> directive. Tags defined by the
|
|
<a class="reference external" href="directives.html#directive-%Platforms"><tt class="xref docutils literal"><span class="pre">%Platforms</span></tt></a> directive are mutually exclusive, i.e. only one
|
|
may be valid at a time <a class="footnote-reference" href="#id13" id="id10">[6]</a>.</li>
|
|
</ul>
|
|
</blockquote>
|
|
<p>One question you might have at this point is why bother to define the private
|
|
copy constructor when it can never be called from Python? The answer is to
|
|
prevent the automatic generation of a public copy constructor.</p>
|
|
<p>We now look at the <tt class="docutils literal"><span class="pre">configure.py</span></tt> script. This is a little different to the
|
|
script in the previous examples for two related reasons.</p>
|
|
<p>Firstly, PyTQt includes a pure Python module called <tt class="docutils literal"><span class="pre">pyqtconfig</span></tt> that extends
|
|
the SIP build system for modules, like our example, that build on top of PyTQt.
|
|
It deals with the details of which version of TQt is being used (i.e. it
|
|
determines what the correct tags are) and where it is installed. This is
|
|
called a module’s configuration module.</p>
|
|
<p>Secondly, we generate a configuration module (called <tt class="docutils literal"><span class="pre">helloconfig</span></tt>) for our
|
|
own <tt class="docutils literal"><span class="pre">hello</span></tt> module. There is no need to do this, but if there is a chance
|
|
that somebody else might want to extend your C++ library then it would make
|
|
life easier for them.</p>
|
|
<p>Now we have two scripts. First the <tt class="docutils literal"><span class="pre">configure.py</span></tt> script:</p>
|
|
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">os</span>
|
|
<span class="kn">import</span> <span class="nn">sipconfig</span>
|
|
<span class="kn">from</span> <span class="nn">PyTQt4</span> <span class="kn">import</span> <span class="n">pyqtconfig</span>
|
|
|
|
<span class="c"># The name of the SIP build file generated by SIP and used by the build</span>
|
|
<span class="c"># system.</span>
|
|
<span class="n">build_file</span> <span class="o">=</span> <span class="s">"hello.sbf"</span>
|
|
|
|
<span class="c"># Get the PyTQt configuration information.</span>
|
|
<span class="n">config</span> <span class="o">=</span> <span class="n">pyqtconfig</span><span class="o">.</span><span class="n">Configuration</span><span class="p">()</span>
|
|
|
|
<span class="c"># Get the extra SIP flags needed by the imported PyTQt modules. Note that</span>
|
|
<span class="c"># this normally only includes those flags (-x and -t) that relate to SIP's</span>
|
|
<span class="c"># versioning system.</span>
|
|
<span class="n">pyqt_sip_flags</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">pyqt_sip_flags</span>
|
|
|
|
<span class="c"># Run SIP to generate the code. Note that we tell SIP where to find the qt</span>
|
|
<span class="c"># module's specification files using the -I flag.</span>
|
|
<span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s">" "</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">config</span><span class="o">.</span><span class="n">sip_bin</span><span class="p">,</span> <span class="s">"-c"</span><span class="p">,</span> <span class="s">"."</span><span class="p">,</span> <span class="s">"-b"</span><span class="p">,</span> <span class="n">build_file</span><span class="p">,</span> <span class="s">"-I"</span><span class="p">,</span> <span class="n">config</span><span class="o">.</span><span class="n">pyqt_sip_dir</span><span class="p">,</span> <span class="n">pyqt_sip_flags</span><span class="p">,</span> <span class="s">"hello.sip"</span><span class="p">]))</span>
|
|
|
|
<span class="c"># We are going to install the SIP specification file for this module and</span>
|
|
<span class="c"># its configuration module.</span>
|
|
<span class="n">installs</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
<span class="n">installs</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="s">"hello.sip"</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">config</span><span class="o">.</span><span class="n">default_sip_dir</span><span class="p">,</span> <span class="s">"hello"</span><span class="p">)])</span>
|
|
|
|
<span class="n">installs</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="s">"helloconfig.py"</span><span class="p">,</span> <span class="n">config</span><span class="o">.</span><span class="n">default_mod_dir</span><span class="p">])</span>
|
|
|
|
<span class="c"># Create the Makefile. The TQtGuiModuleMakefile class provided by the</span>
|
|
<span class="c"># pyqtconfig module takes care of all the extra preprocessor, compiler and</span>
|
|
<span class="c"># linker flags needed by the TQt library.</span>
|
|
<span class="n">makefile</span> <span class="o">=</span> <span class="n">pyqtconfig</span><span class="o">.</span><span class="n">TQtGuiModuleMakefile</span><span class="p">(</span>
|
|
<span class="n">configuration</span><span class="o">=</span><span class="n">config</span><span class="p">,</span>
|
|
<span class="n">build_file</span><span class="o">=</span><span class="n">build_file</span><span class="p">,</span>
|
|
<span class="n">installs</span><span class="o">=</span><span class="n">installs</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="c"># Add the library we are wrapping. The name doesn't include any platform</span>
|
|
<span class="c"># specific prefixes or extensions (e.g. the "lib" prefix on UNIX, or the</span>
|
|
<span class="c"># ".dll" extension on Windows).</span>
|
|
<span class="n">makefile</span><span class="o">.</span><span class="n">extra_libs</span> <span class="o">=</span> <span class="p">[</span><span class="s">"hello"</span><span class="p">]</span>
|
|
|
|
<span class="c"># Generate the Makefile itself.</span>
|
|
<span class="n">makefile</span><span class="o">.</span><span class="n">generate</span><span class="p">()</span>
|
|
|
|
<span class="c"># Now we create the configuration module. This is done by merging a Python</span>
|
|
<span class="c"># dictionary (whose values are normally determined dynamically) with a</span>
|
|
<span class="c"># (static) template.</span>
|
|
<span class="n">content</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="c"># Publish where the SIP specifications for this module will be</span>
|
|
<span class="c"># installed.</span>
|
|
<span class="s">"hello_sip_dir"</span><span class="p">:</span> <span class="n">config</span><span class="o">.</span><span class="n">default_sip_dir</span><span class="p">,</span>
|
|
|
|
<span class="c"># Publish the set of SIP flags needed by this module. As these are the</span>
|
|
<span class="c"># same flags needed by the qt module we could leave it out, but this</span>
|
|
<span class="c"># allows us to change the flags at a later date without breaking</span>
|
|
<span class="c"># scripts that import the configuration module.</span>
|
|
<span class="s">"hello_sip_flags"</span><span class="p">:</span> <span class="n">pyqt_sip_flags</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="c"># This creates the helloconfig.py module from the helloconfig.py.in</span>
|
|
<span class="c"># template and the dictionary.</span>
|
|
<span class="n">sipconfig</span><span class="o">.</span><span class="n">create_config_module</span><span class="p">(</span><span class="s">"helloconfig.py"</span><span class="p">,</span> <span class="s">"helloconfig.py.in"</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span>
|
|
</pre></div>
|
|
</div>
|
|
<p>Next we have the <tt class="docutils literal"><span class="pre">helloconfig.py.in</span></tt> template script:</p>
|
|
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">PyTQt4</span> <span class="kn">import</span> <span class="n">pyqtconfig</span>
|
|
|
|
<span class="c"># These are installation specific values created when Hello was configured.</span>
|
|
<span class="c"># The following line will be replaced when this template is used to create</span>
|
|
<span class="c"># the final configuration module.</span>
|
|
<span class="c"># @SIP_CONFIGURATION@</span>
|
|
|
|
<span class="k">class</span> <span class="nc">Configuration</span><span class="p">(</span><span class="n">pyqtconfig</span><span class="o">.</span><span class="n">Configuration</span><span class="p">):</span>
|
|
<span class="sd">"""The class that represents Hello configuration values.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sub_cfg</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
|
|
<span class="sd">"""Initialise an instance of the class.</span>
|
|
|
|
<span class="sd"> sub_cfg is the list of sub-class configurations. It should be None</span>
|
|
<span class="sd"> when called normally.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c"># This is all standard code to be copied verbatim except for the</span>
|
|
<span class="c"># name of the module containing the super-class.</span>
|
|
<span class="k">if</span> <span class="n">sub_cfg</span><span class="p">:</span>
|
|
<span class="n">cfg</span> <span class="o">=</span> <span class="n">sub_cfg</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">cfg</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
<span class="n">cfg</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_pkg_config</span><span class="p">)</span>
|
|
|
|
<span class="n">pyqtconfig</span><span class="o">.</span><span class="n">Configuration</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cfg</span><span class="p">)</span>
|
|
|
|
<span class="k">class</span> <span class="nc">HelloModuleMakefile</span><span class="p">(</span><span class="n">pyqtconfig</span><span class="o">.</span><span class="n">TQtGuiModuleMakefile</span><span class="p">):</span>
|
|
<span class="sd">"""The Makefile class for modules that %Import hello.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">def</span> <span class="nf">finalise</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Finalise the macros.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c"># Make sure our C++ library is linked.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">extra_libs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">"hello"</span><span class="p">)</span>
|
|
|
|
<span class="c"># Let the super-class do what it needs to.</span>
|
|
<span class="n">pyqtconfig</span><span class="o">.</span><span class="n">TQtGuiModuleMakefile</span><span class="o">.</span><span class="n">finalise</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
</pre></div>
|
|
</div>
|
|
<p>Again, we hope that the scripts are self documenting.</p>
|
|
<table class="docutils footnote" frame="void" id="id11" rules="none">
|
|
<colgroup><col class="label" /><col /></colgroup>
|
|
<tbody valign="top">
|
|
<tr><td class="label"><a class="fn-backref" href="#id8">[4]</a></td><td>Some parts of a SIP specification aren’t subject to version control.</td></tr>
|
|
</tbody>
|
|
</table>
|
|
<table class="docutils footnote" frame="void" id="id12" rules="none">
|
|
<colgroup><col class="label" /><col /></colgroup>
|
|
<tbody valign="top">
|
|
<tr><td class="label"><a class="fn-backref" href="#id9">[5]</a></td><td>Actually in <tt class="docutils literal"><span class="pre">versions.sip</span></tt>. PyTQt uses the <a class="reference external" href="directives.html#directive-%Include"><tt class="xref docutils literal"><span class="pre">%Include</span></tt></a>
|
|
directive to split the SIP specification for TQt across a large number of
|
|
separate <tt class="docutils literal"><span class="pre">.sip</span></tt> files.</td></tr>
|
|
</tbody>
|
|
</table>
|
|
<table class="docutils footnote" frame="void" id="id13" rules="none">
|
|
<colgroup><col class="label" /><col /></colgroup>
|
|
<tbody valign="top">
|
|
<tr><td class="label"><a class="fn-backref" href="#id10">[6]</a></td><td>Tags can also be defined by the <a class="reference external" href="directives.html#directive-%Feature"><tt class="xref docutils literal"><span class="pre">%Feature</span></tt></a> directive. These
|
|
tags are not mutually exclusive, i.e. any number may be valid at a time.</td></tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div class="section" id="ownership-of-objects">
|
|
<span id="ref-object-ownership"></span><h2>Ownership of Objects<a class="headerlink" href="#ownership-of-objects" title="Permalink to this headline">¶</a></h2>
|
|
<p>When a C++ instance is wrapped a corresponding Python object is created. The
|
|
Python object behaves as you would expect in regard to garbage collection - it
|
|
is garbage collected when its reference count reaches zero. What then happens
|
|
to the corresponding C++ instance? The obvious answer might be that the
|
|
instance’s destructor is called. However the library API may say that when the
|
|
instance is passed to a particular function, the library takes ownership of the
|
|
instance, i.e. responsibility for calling the instance’s destructor is
|
|
transferred from the SIP generated module to the library.</p>
|
|
<p>Ownership of an instance may also be associated with another instance. The
|
|
implication being that the owned instance will automatically be destroyed if
|
|
the owning instance is destroyed. SIP keeps track of these relationships to
|
|
ensure that Python’s cyclic garbage collector can detect and break any
|
|
reference cycles between the owning and owned instances. The association is
|
|
implemented as the owning instance taking a reference to the owned instance.</p>
|
|
<p>The TransferThis, Transfer and TransferBack annotations are used to specify
|
|
where, and it what direction, transfers of ownership happen. It is very
|
|
important that these are specified correctly to avoid crashes (where both
|
|
Python and C++ call the destructor) and memory leaks (where neither Python and
|
|
C++ call the destructor).</p>
|
|
<p>This applies equally to C structures where the structure is returned to the
|
|
heap using the <tt class="docutils literal"><span class="pre">free()</span></tt> function.</p>
|
|
<p>See also <a title="sipTransferTo" class="reference external" href="c_api.html#sipTransferTo"><tt class="xref docutils literal"><span class="pre">sipTransferTo()</span></tt></a>, <a title="sipTransferBack" class="reference external" href="c_api.html#sipTransferBack"><tt class="xref docutils literal"><span class="pre">sipTransferBack()</span></tt></a> and
|
|
<a title="sipTransferBreak" class="reference external" href="c_api.html#sipTransferBreak"><tt class="xref docutils literal"><span class="pre">sipTransferBreak()</span></tt></a>.</p>
|
|
</div>
|
|
<div class="section" id="types-and-meta-types">
|
|
<span id="ref-types-metatypes"></span><h2>Types and Meta-types<a class="headerlink" href="#types-and-meta-types" title="Permalink to this headline">¶</a></h2>
|
|
<p>Every Python object (with the exception of the <tt class="xref docutils literal"><span class="pre">object</span></tt> object itself)
|
|
has a meta-type and at least one super-type. By default an object’s meta-type
|
|
is the meta-type of its first super-type.</p>
|
|
<p>SIP implements two super-types, <tt class="xref docutils literal"><span class="pre">sip.simplewrapper</span></tt> and
|
|
<a title="sip.wrapper" class="reference external" href="python_api.html#sip.wrapper"><tt class="xref docutils literal"><span class="pre">sip.wrapper</span></tt></a>, and a meta-type, <a title="sip.wrappertype" class="reference external" href="python_api.html#sip.wrappertype"><tt class="xref docutils literal"><span class="pre">sip.wrappertype</span></tt></a>.</p>
|
|
<p><tt class="xref docutils literal"><span class="pre">sip.simplewrapper</span></tt> is the super-type of <a title="sip.wrapper" class="reference external" href="python_api.html#sip.wrapper"><tt class="xref docutils literal"><span class="pre">sip.wrapper</span></tt></a>. The
|
|
super-type of <tt class="xref docutils literal"><span class="pre">sip.simplewrapper</span></tt> is <tt class="xref docutils literal"><span class="pre">object</span></tt>.</p>
|
|
<p><a title="sip.wrappertype" class="reference external" href="python_api.html#sip.wrappertype"><tt class="xref docutils literal"><span class="pre">sip.wrappertype</span></tt></a> is the meta-type of both <tt class="xref docutils literal"><span class="pre">sip.simplewrapper</span></tt>
|
|
and <a title="sip.wrapper" class="reference external" href="python_api.html#sip.wrapper"><tt class="xref docutils literal"><span class="pre">sip.wrapper</span></tt></a>. The super-type of <a title="sip.wrappertype" class="reference external" href="python_api.html#sip.wrappertype"><tt class="xref docutils literal"><span class="pre">sip.wrappertype</span></tt></a> is
|
|
<tt class="xref docutils literal"><span class="pre">type</span></tt>.</p>
|
|
<p><a title="sip.wrapper" class="reference external" href="python_api.html#sip.wrapper"><tt class="xref docutils literal"><span class="pre">sip.wrapper</span></tt></a> supports the concept of object ownership described in
|
|
<a class="reference internal" href="#ref-object-ownership"><em>Ownership of Objects</em></a> and, by default, is the super-type of all the types
|
|
that SIP generates.</p>
|
|
<p><tt class="xref docutils literal"><span class="pre">sip.simplewrapper</span></tt> does not support the concept of object ownership but
|
|
SIP generated types that are sub-classed from it have Python objects that take
|
|
less memory.</p>
|
|
<p>SIP allows a class’s meta-type and super-type to be explicitly specified using
|
|
the <a class="reference external" href="annotations.html#canno-Metatype"><tt class="xref docutils literal"><span class="pre">Metatype</span></tt></a> and <a class="reference external" href="annotations.html#canno-Supertype"><tt class="xref docutils literal"><span class="pre">Supertype</span></tt></a> class annotations.</p>
|
|
<p>SIP also allows the default meta-type and super-type to be changed for a module
|
|
using the <a class="reference external" href="directives.html#directive-%DefaultMetatype"><tt class="xref docutils literal"><span class="pre">%DefaultMetatype</span></tt></a> and <a class="reference external" href="directives.html#directive-%DefaultSupertype"><tt class="xref docutils literal"><span class="pre">%DefaultSupertype</span></tt></a>
|
|
directives. Unlike the default super-type, the default meta-type is inherited
|
|
by importing modules.</p>
|
|
<p>If you want to use your own meta-type or super-type then they must be
|
|
sub-classed from one of the SIP provided types. Your types must be registered
|
|
using <a title="sipRegisterPyType" class="reference external" href="c_api.html#sipRegisterPyType"><tt class="xref docutils literal"><span class="pre">sipRegisterPyType()</span></tt></a>. This is normally done in code specified
|
|
using the <a class="reference external" href="directives.html#directive-%InitialisationCode"><tt class="xref docutils literal"><span class="pre">%InitialisationCode</span></tt></a> directive.</p>
|
|
<p>As an example, PyTQt4 uses <a class="reference external" href="directives.html#directive-%DefaultMetatype"><tt class="xref docutils literal"><span class="pre">%DefaultMetatype</span></tt></a> to specify a new
|
|
meta-type that handles the interaction with TQt’s own meta-type system. It also
|
|
uses <a class="reference external" href="directives.html#directive-%DefaultSupertype"><tt class="xref docutils literal"><span class="pre">%DefaultSupertype</span></tt></a> to specify that the smaller
|
|
<tt class="xref docutils literal"><span class="pre">sip.simplewrapper</span></tt> super-type is normally used. Finally it uses
|
|
<a class="reference external" href="annotations.html#canno-Supertype"><tt class="xref docutils literal"><span class="pre">Supertype</span></tt></a> as an annotation of the <tt class="docutils literal"><span class="pre">TQObject</span></tt> class to override the
|
|
default and use <a title="sip.wrapper" class="reference external" href="python_api.html#sip.wrapper"><tt class="xref docutils literal"><span class="pre">sip.wrapper</span></tt></a> as the super-type so that the parent/child
|
|
relationships of <tt class="docutils literal"><span class="pre">TQObject</span></tt> instances are properly maintained.</p>
|
|
</div>
|
|
<div class="section" id="lazy-type-attributes">
|
|
<span id="ref-lazy-type-attributes"></span><h2>Lazy Type Attributes<a class="headerlink" href="#lazy-type-attributes" title="Permalink to this headline">¶</a></h2>
|
|
<p>Instead of populating a wrapped type’s dictionary with its attributes (or
|
|
descriptors for those attributes) SIP only creates objects for those attributes
|
|
when they are actually needed. This is done to reduce the memory footprint and
|
|
start up time when used to wrap large libraries with hundreds of classes and
|
|
tens of thousands of attributes.</p>
|
|
<p>SIP allows you to extend the handling of lazy attributes to your own attribute
|
|
types by allowing you to register an attribute getter handler (using
|
|
<a title="sipRegisterAttributeGetter" class="reference external" href="c_api.html#sipRegisterAttributeGetter"><tt class="xref docutils literal"><span class="pre">sipRegisterAttributeGetter()</span></tt></a>). This will be called just before a
|
|
type’s dictionary is accessed for the first time.</p>
|
|
</div>
|
|
<div class="section" id="support-for-python-s-buffer-interface">
|
|
<h2>Support for Python’s Buffer Interface<a class="headerlink" href="#support-for-python-s-buffer-interface" title="Permalink to this headline">¶</a></h2>
|
|
<p>SIP supports Python’s buffer interface in that whenever C/C++ requires a
|
|
<tt class="docutils literal"><span class="pre">char</span></tt> or <tt class="docutils literal"><span class="pre">char</span> <span class="pre">*</span></tt> type then any Python type that supports the buffer
|
|
interface (including ordinary Python strings) can be used.</p>
|
|
<p>If a buffer is made up of a number of segments then all but the first will be
|
|
ignored.</p>
|
|
</div>
|
|
<div class="section" id="support-for-wide-characters">
|
|
<h2>Support for Wide Characters<a class="headerlink" href="#support-for-wide-characters" title="Permalink to this headline">¶</a></h2>
|
|
<p>SIP v4.6 introduced support for wide characters (i.e. the <tt class="docutils literal"><span class="pre">wchar_t</span></tt> type).
|
|
Python’s C API includes support for converting between unicode objects and wide
|
|
character strings and arrays. When converting from a unicode object to wide
|
|
characters SIP creates the string or array on the heap (using memory allocated
|
|
using <a title="sipMalloc" class="reference external" href="c_api.html#sipMalloc"><tt class="xref docutils literal"><span class="pre">sipMalloc()</span></tt></a>). This then raises the problem of how this memory
|
|
is subsequently freed.</p>
|
|
<p>The following describes how SIP handles this memory in the different situations
|
|
where this is an issue.</p>
|
|
<blockquote>
|
|
<ul class="simple">
|
|
<li>When a wide string or array is passed to a function or method then the
|
|
memory is freed (using <a title="sipFree" class="reference external" href="c_api.html#sipFree"><tt class="xref docutils literal"><span class="pre">sipFree()</span></tt></a>) after than function or method
|
|
returns.</li>
|
|
<li>When a wide string or array is returned from a virtual method then SIP
|
|
does not free the memory until the next time the method is called.</li>
|
|
<li>When an assignment is made to a wide string or array instance variable
|
|
then SIP does not first free the instance’s current string or array.</li>
|
|
</ul>
|
|
</blockquote>
|
|
</div>
|
|
<div class="section" id="the-python-global-interpreter-lock">
|
|
<span id="ref-gil"></span><h2>The Python Global Interpreter Lock<a class="headerlink" href="#the-python-global-interpreter-lock" title="Permalink to this headline">¶</a></h2>
|
|
<p>Python’s Global Interpretor Lock (GIL) must be acquired before calls can be
|
|
made to the Python API. It should also be released when a potentially
|
|
blocking call to C/C++ library is made in order to allow other Python threads
|
|
to be executed. In addition, some C/C++ libraries may implement their own
|
|
locking strategies that conflict with the GIL causing application deadlocks.
|
|
SIP provides ways of specifying when the GIL is released and acquired to
|
|
ensure that locking problems can be avoided.</p>
|
|
<p>SIP always ensures that the GIL is acquired before making calls to the Python
|
|
API. By default SIP does not release the GIL when making calls to the C/C++
|
|
library being wrapped. The <a class="reference external" href="annotations.html#fanno-ReleaseGIL"><tt class="xref docutils literal"><span class="pre">ReleaseGIL</span></tt></a> annotation can be used to
|
|
override this behaviour when required.</p>
|
|
<p>If SIP is given the <a class="reference external" href="command_line.html#cmdoption-sip-g"><em class="xref">-g</em></a> command line option then the default
|
|
behaviour is changed and SIP releases the GIL every time is makes calls to the
|
|
C/C++ library being wrapped. The <a class="reference external" href="annotations.html#fanno-HoldGIL"><tt class="xref docutils literal"><span class="pre">HoldGIL</span></tt></a> annotation can be used to
|
|
override this behaviour when required.</p>
|
|
</div>
|
|
<div class="section" id="managing-incompatible-apis">
|
|
<span id="ref-incompat-apis"></span><h2>Managing Incompatible APIs<a class="headerlink" href="#managing-incompatible-apis" title="Permalink to this headline">¶</a></h2>
|
|
<p>
|
|
<span class="versionmodified">New in version 4.9.</span></p>
|
|
<p>Sometimes it is necessary to change the way something is wrapped in a way that
|
|
introduces an incompatibility. For example a new feature of Python may
|
|
suggest that something may be wrapped in a different way to exploit that
|
|
feature.</p>
|
|
<p>SIP’s <a class="reference external" href="directives.html#directive-%Feature"><tt class="xref docutils literal"><span class="pre">%Feature</span></tt></a> directive could be used to provide two different
|
|
implementations. However this would mean that the choice between the two
|
|
implementations would have to be made when building the generated module
|
|
potentially causing all sorts of deployment problems. It may also require
|
|
applications to work out which implementation was available and to change
|
|
their behaviour accordingly.</p>
|
|
<p>Instead SIP provides limited support for providing multiple implementations
|
|
(of classes, mapped types and functions) that can be selected by an
|
|
application at run-time. It is then up to the application developer how they
|
|
want to manage the migration from the old API to the new, incompatible API.</p>
|
|
<p>This support is implemented in three parts.</p>
|
|
<p>Firstly the <a class="reference external" href="directives.html#directive-%API"><tt class="xref docutils literal"><span class="pre">%API</span></tt></a> directive is used to define the name of an API
|
|
and its default version number. The default version number is the one used if
|
|
an application doesn’t explicitly set the version number to use.</p>
|
|
<p>Secondly the <a class="reference external" href="annotations.html#canno-API"><tt class="xref docutils literal"><span class="pre">API</span> <span class="pre">class</span></tt></a>, <a class="reference external" href="annotations.html#manno-API"><tt class="xref docutils literal"><span class="pre">mapped</span> <span class="pre">type</span></tt></a> or
|
|
<a class="reference external" href="annotations.html#fanno-API"><tt class="xref docutils literal"><span class="pre">function</span></tt></a> annotation is applied accordingly to specify the API
|
|
and range of version numbers that a particular class, mapped type or function
|
|
implementation should be enabled for.</p>
|
|
<p>Finally the application calls <a title="sip.setapi" class="reference external" href="python_api.html#sip.setapi"><tt class="xref docutils literal"><span class="pre">sip.setapi()</span></tt></a> to specify the version number
|
|
of the API that should be enabled. This call must be made before any module
|
|
that has multiple implementations is imported for the first time.</p>
|
|
<p>Note this mechanism is not intended as a way or providing equally valid
|
|
alternative APIs. For example:</p>
|
|
<div class="highlight-python"><pre>%API MyAPI 1
|
|
|
|
class Foo
|
|
{
|
|
public:
|
|
void bar();
|
|
};
|
|
|
|
class Baz : Foo
|
|
{
|
|
public:
|
|
void bar() /API=MyAPI:2-/;
|
|
};</pre>
|
|
</div>
|
|
<p>If the following Python code is executed then an exception will be raised:</p>
|
|
<div class="highlight-python"><div class="highlight"><pre><span class="n">b</span> <span class="o">=</span> <span class="n">Baz</span><span class="p">()</span>
|
|
<span class="n">b</span><span class="o">.</span><span class="n">bar</span><span class="p">()</span>
|
|
</pre></div>
|
|
</div>
|
|
<p>This is because when version 1 of the <em>MyAPI</em> API (the default) is enabled
|
|
there is no <em>Baz.bar()</em> implementation and <em>Foo.bar()</em> will not be called
|
|
instead as might be expected.</p>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sphinxsidebar">
|
|
<div class="sphinxsidebarwrapper">
|
|
<h3><a href="index.html">Table Of Contents</a></h3>
|
|
<ul>
|
|
<li><a class="reference external" href="#">Using SIP</a><ul>
|
|
<li><a class="reference external" href="#a-simple-c-example">A Simple C++ Example</a></li>
|
|
<li><a class="reference external" href="#id7">A Simple C Example</a></li>
|
|
<li><a class="reference external" href="#a-more-complex-c-example">A More Complex C++ Example</a></li>
|
|
<li><a class="reference external" href="#ownership-of-objects">Ownership of Objects</a></li>
|
|
<li><a class="reference external" href="#types-and-meta-types">Types and Meta-types</a></li>
|
|
<li><a class="reference external" href="#lazy-type-attributes">Lazy Type Attributes</a></li>
|
|
<li><a class="reference external" href="#support-for-python-s-buffer-interface">Support for Python’s Buffer Interface</a></li>
|
|
<li><a class="reference external" href="#support-for-wide-characters">Support for Wide Characters</a></li>
|
|
<li><a class="reference external" href="#the-python-global-interpreter-lock">The Python Global Interpreter Lock</a></li>
|
|
<li><a class="reference external" href="#managing-incompatible-apis">Managing Incompatible APIs</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
|
|
<h4>Previous topic</h4>
|
|
<p class="topless"><a href="installation.html"
|
|
title="previous chapter">Installation</a></p>
|
|
<h4>Next topic</h4>
|
|
<p class="topless"><a href="command_line.html"
|
|
title="next chapter">The SIP Command Line</a></p>
|
|
<div id="searchbox" style="display: none">
|
|
<h3>Quick search</h3>
|
|
<form class="search" action="search.html" method="get">
|
|
<input type="text" name="q" size="18" />
|
|
<input type="submit" value="Go" />
|
|
<input type="hidden" name="check_keywords" value="yes" />
|
|
<input type="hidden" name="area" value="default" />
|
|
</form>
|
|
<p class="searchtip" style="font-size: 90%">
|
|
Enter search terms or a module, class or function name.
|
|
</p>
|
|
</div>
|
|
<script type="text/javascript">$('#searchbox').show(0);</script>
|
|
</div>
|
|
</div>
|
|
<div class="clearer"></div>
|
|
</div>
|
|
<div class="related">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="genindex.html" title="General Index"
|
|
>index</a></li>
|
|
<li class="right" >
|
|
<a href="modindex.html" title="Global Module Index"
|
|
>modules</a> |</li>
|
|
<li class="right" >
|
|
<a href="command_line.html" title="The SIP Command Line"
|
|
>next</a> |</li>
|
|
<li class="right" >
|
|
<a href="installation.html" title="Installation"
|
|
>previous</a> |</li>
|
|
<li><a href="index.html">SIP 4.10.5 Reference Guide</a> »</li>
|
|
</ul>
|
|
</div>
|
|
<div class="footer">
|
|
© Copyright 2010 Riverbank Computing Limited.
|
|
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.4.
|
|
</div>
|
|
</body>
|
|
</html> |