|
12 | 12 | <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> |
13 | 13 | <table cellpadding="2" width="100%"><tr> |
14 | 14 | <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> |
15 | | -<td align="center"><a href="../../../../../../../index.htm">Home</a></td> |
| 15 | +<td align="center"><a href="../../../../../../../index.html">Home</a></td> |
16 | 16 | <td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> |
17 | | -<td align="center"><a href="../../../../../../../people/people.htm">People</a></td> |
18 | | -<td align="center"><a href="../../../../../../../more/faq.htm">FAQ</a></td> |
| 17 | +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> |
| 18 | +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> |
19 | 19 | <td align="center"><a href="../../../../../../../more/index.htm">More</a></td> |
20 | 20 | </tr></table> |
21 | 21 | <hr> |
|
40 | 40 | Python/C API at all. So stay tuned... <span class="inlinemediaobject"><img src="../images/smiley.png" alt="smiley"></span> |
41 | 41 | </p> |
42 | 42 | <a name="embedding.building_embedded_programs"></a><h2> |
43 | | -<a name="id471330"></a> |
| 43 | +<a name="id472330"></a> |
44 | 44 | Building embedded programs |
45 | 45 | </h2> |
46 | 46 | <p> |
|
82 | 82 | <find-library>$(PYTHON_EMBEDDED_LIBRARY) ; |
83 | 83 | </pre> |
84 | 84 | <a name="embedding.getting_started"></a><h2> |
85 | | -<a name="id471435"></a> |
| 85 | +<a name="id472435"></a> |
86 | 86 | Getting started |
87 | 87 | </h2> |
88 | 88 | <p> |
|
130 | 130 | <a name="python.using_the_interpreter"></a>Using the interpreter</h3></div></div></div> |
131 | 131 | <p> |
132 | 132 | As you probably already know, objects in Python are reference-counted. Naturally, |
133 | | - the <tt class="literal">PyObject</tt>s of the Python/C API are also reference-counted. |
| 133 | + the <tt class="literal">PyObject</tt>s of the Python C API are also reference-counted. |
134 | 134 | There is a difference however. While the reference-counting is fully automatic |
135 | | - in Python, the Python<span class="emphasis"><em>C API requires you to do it [@http:</em></span>/www.python.org/doc/current/api/refcounts.html |
136 | | - by hand]. This is messy and especially hard to get right in the presence |
| 135 | + in Python, the Python C API requires you to do it <a href="http://www.python.org/doc/current/c-api/refcounting.html" target="_top">by |
| 136 | + hand</a>. This is messy and especially hard to get right in the presence |
137 | 137 | of C++ exceptions. Fortunately Boost.Python provides the <a href="../../../../v2/handle.html" target="_top">handle</a> |
138 | 138 | and <a href="../../../../v2/object.html" target="_top">object</a> class templates to |
139 | 139 | automate the process. |
140 | 140 | </p> |
141 | 141 | <a name="using_the_interpreter.running_python_code"></a><h2> |
142 | | -<a name="id471598"></a> |
| 142 | +<a name="id472601"></a> |
143 | 143 | Running Python code |
144 | 144 | </h2> |
145 | 145 | <p> |
146 | 146 | Boost.python provides three related functions to run Python code from C++. |
147 | 147 | </p> |
148 | | -<pre class="programlisting"> |
149 | | -<span class="identifier">object</span> <span class="identifier">eval</span><span class="special">(</span><span class="identifier">str</span> <span class="identifier">expression</span><span class="special">,</span> <span class="identifier">object</span> <span class="identifier">globals</span> <span class="special">=</span> <span class="identifier">object</span><span class="special">(),</span> <span class="identifier">object</span> <span class="identifier">locals</span> <span class="special">=</span> <span class="identifier">object</span><span class="special">())</span> |
| 148 | +<pre class="programlisting"><span class="identifier">object</span> <span class="identifier">eval</span><span class="special">(</span><span class="identifier">str</span> <span class="identifier">expression</span><span class="special">,</span> <span class="identifier">object</span> <span class="identifier">globals</span> <span class="special">=</span> <span class="identifier">object</span><span class="special">(),</span> <span class="identifier">object</span> <span class="identifier">locals</span> <span class="special">=</span> <span class="identifier">object</span><span class="special">())</span> |
150 | 149 | <span class="identifier">object</span> <span class="identifier">exec</span><span class="special">(</span><span class="identifier">str</span> <span class="identifier">code</span><span class="special">,</span> <span class="identifier">object</span> <span class="identifier">globals</span> <span class="special">=</span> <span class="identifier">object</span><span class="special">(),</span> <span class="identifier">object</span> <span class="identifier">locals</span> <span class="special">=</span> <span class="identifier">object</span><span class="special">())</span> |
151 | 150 | <span class="identifier">object</span> <span class="identifier">exec_file</span><span class="special">(</span><span class="identifier">str</span> <span class="identifier">filename</span><span class="special">,</span> <span class="identifier">object</span> <span class="identifier">globals</span> <span class="special">=</span> <span class="identifier">object</span><span class="special">(),</span> <span class="identifier">object</span> <span class="identifier">locals</span> <span class="special">=</span> <span class="identifier">object</span><span class="special">())</span> |
152 | 151 | </pre> |
|
165 | 164 | <p> |
166 | 165 | Boost.python provides a function to import a module: |
167 | 166 | </p> |
168 | | -<pre class="programlisting"> |
169 | | -<span class="identifier">object</span> <span class="identifier">import</span><span class="special">(</span><span class="identifier">str</span> <span class="identifier">name</span><span class="special">)</span> |
| 167 | +<pre class="programlisting"><span class="identifier">object</span> <span class="identifier">import</span><span class="special">(</span><span class="identifier">str</span> <span class="identifier">name</span><span class="special">)</span> |
170 | 168 | </pre> |
171 | 169 | <p> |
172 | 170 | import imports a python module (potentially loading it into the running process |
|
176 | 174 | Let's import the <tt class="literal"><span class="underline">_main</span>_</tt> |
177 | 175 | module and run some Python code in its namespace: |
178 | 176 | </p> |
179 | | -<pre class="programlisting"> |
180 | | -<span class="identifier">object</span> <span class="identifier">main_module</span> <span class="special">=</span> <span class="identifier">import</span><span class="special">(</span><span class="string">"__main__"</span><span class="special">);</span> |
| 177 | +<pre class="programlisting"><span class="identifier">object</span> <span class="identifier">main_module</span> <span class="special">=</span> <span class="identifier">import</span><span class="special">(</span><span class="string">"__main__"</span><span class="special">);</span> |
181 | 178 | <span class="identifier">object</span> <span class="identifier">main_namespace</span> <span class="special">=</span> <span class="identifier">main_module</span><span class="special">.</span><span class="identifier">attr</span><span class="special">(</span><span class="string">"__dict__"</span><span class="special">);</span> |
182 | 179 |
|
183 | 180 | <span class="identifier">object</span> <span class="identifier">ignored</span> <span class="special">=</span> <span class="identifier">exec</span><span class="special">(</span><span class="string">"hello = file('hello.txt', 'w')\n"</span> |
|
190 | 187 | a phrase that is well-known in programming circles. |
191 | 188 | </p> |
192 | 189 | <a name="using_the_interpreter.manipulating_python_objects"></a><h2> |
193 | | -<a name="id472186"></a> |
| 190 | +<a name="id473185"></a> |
194 | 191 | Manipulating Python objects |
195 | 192 | </h2> |
196 | 193 | <p> |
|
200 | 197 | derivatives. We've already seen that they can be constructed from a <tt class="literal">handle</tt>. |
201 | 198 | The following examples should further illustrate this fact: |
202 | 199 | </p> |
203 | | -<pre class="programlisting"> |
204 | | -<span class="identifier">object</span> <span class="identifier">main_module</span> <span class="special">=</span> <span class="identifier">import</span><span class="special">(</span><span class="string">"__main__"</span><span class="special">);</span> |
| 200 | +<pre class="programlisting"><span class="identifier">object</span> <span class="identifier">main_module</span> <span class="special">=</span> <span class="identifier">import</span><span class="special">(</span><span class="string">"__main__"</span><span class="special">);</span> |
205 | 201 | <span class="identifier">object</span> <span class="identifier">main_namespace</span> <span class="special">=</span> <span class="identifier">main_module</span><span class="special">.</span><span class="identifier">attr</span><span class="special">(</span><span class="string">"__dict__"</span><span class="special">);</span> |
206 | 202 | <span class="identifier">object</span> <span class="identifier">ignored</span> <span class="special">=</span> <span class="identifier">exec</span><span class="special">(</span><span class="string">"result = 5 ** 2"</span><span class="special">,</span> <span class="identifier">main_namespace</span><span class="special">);</span> |
207 | 203 | <span class="keyword">int</span> <span class="identifier">five_squared</span> <span class="special">=</span> <span class="identifier">extract</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="identifier">main_namespace</span><span class="special">[</span><span class="string">"result"</span><span class="special">]);</span> |
|
212 | 208 | this variable from the dictionary. Another way to achieve the same result |
213 | 209 | is to use eval instead, which returns the result directly: |
214 | 210 | </p> |
215 | | -<pre class="programlisting"> |
216 | | -<span class="identifier">object</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">eval</span><span class="special">(</span><span class="string">"5 ** 2"</span><span class="special">);</span> |
| 211 | +<pre class="programlisting"><span class="identifier">object</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">eval</span><span class="special">(</span><span class="string">"5 ** 2"</span><span class="special">);</span> |
217 | 212 | <span class="keyword">int</span> <span class="identifier">five_squared</span> <span class="special">=</span> <span class="identifier">extract</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="identifier">result</span><span class="special">);</span> |
218 | 213 | </pre> |
219 | 214 | <a name="using_the_interpreter.exception_handling"></a><h2> |
220 | | -<a name="id472558"></a> |
| 215 | +<a name="id473554"></a> |
221 | 216 | Exception handling |
222 | 217 | </h2> |
223 | 218 | <p> |
224 | 219 | If an exception occurs in the evaluation of the python expression, <a href="../../../../v2/errors.html#error_already_set-spec" target="_top">error_already_set</a> |
225 | 220 | is thrown: |
226 | 221 | </p> |
227 | | -<pre class="programlisting"> |
228 | | -<span class="keyword">try</span> |
| 222 | +<pre class="programlisting"><span class="keyword">try</span> |
229 | 223 | <span class="special">{</span> |
230 | 224 | <span class="identifier">object</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">eval</span><span class="special">(</span><span class="string">"5/0"</span><span class="special">);</span> |
231 | 225 | <span class="comment">// execution will never get here: |
|
240 | 234 | The <tt class="literal">error_already_set</tt> exception class doesn't carry any |
241 | 235 | information in itself. To find out more about the Python exception that occurred, |
242 | 236 | you need to use the <a href="http://www.python.org/doc/api/exceptionHandling.html" target="_top">exception |
243 | | - handling functions</a> of the Python<span class="emphasis"><em>C API in your catch-statement. |
244 | | - This can be as simple as calling [@http:</em></span>/www.python.org/doc/api/exceptionHandling.html#l2h-70 |
245 | | - PyErr_Print()] to print the exception's traceback to the console, or comparing |
246 | | - the type of the exception with those of the <a href="http://www.python.org/doc/api/standardExceptions.html" target="_top">standard |
| 237 | + handling functions</a> of the Python C API in your catch-statement. This |
| 238 | + can be as simple as calling <a href="http://www.python.org/doc/api/exceptionHandling.html#l2h-70" target="_top">PyErr_Print()</a> |
| 239 | + to print the exception's traceback to the console, or comparing the type |
| 240 | + of the exception with those of the <a href="http://www.python.org/doc/api/standardExceptions.html" target="_top">standard |
247 | 241 | exceptions</a>: |
248 | 242 | </p> |
249 | | -<pre class="programlisting"> |
250 | | -<span class="keyword">catch</span><span class="special">(</span><span class="identifier">error_already_set</span> <span class="keyword">const</span> <span class="special">&)</span> |
| 243 | +<pre class="programlisting"><span class="keyword">catch</span><span class="special">(</span><span class="identifier">error_already_set</span> <span class="keyword">const</span> <span class="special">&)</span> |
251 | 244 | <span class="special">{</span> |
252 | 245 | <span class="keyword">if</span> <span class="special">(</span><span class="identifier">PyErr_ExceptionMatches</span><span class="special">(</span><span class="identifier">PyExc_ZeroDivisionError</span><span class="special">))</span> |
253 | 246 | <span class="special">{</span> |
|
0 commit comments