ePolyglot: Examination and development of multilanguage programming using Eiffel, Python, and Haskell | ||
---|---|---|
Prev | Chapter 11. Calling Eiffel from Python | Next |
The sample application for this creates an Eiffel class, CALLED_FROM_PYTHON, and exports it to Python. The object is manipulated by a Python script in test_module.py, which is exported to Eiffel. The actual Eiffel program, a TEST object, creates the Eiffel CALLED_FROM_PYTHON object and passes it to the test_module.py script, a bizarre three-way shuffle that works fairly seamlessly.
Unfortunately, we are now getting to the point where the Makefile used to generate the sample program is already larger than all the source combined. It contains many peculiar-looking targets which automate the manufacture of automatically-generated code, the eiffel_gluemodule.so file, and many other temporaries, and is worth a look to really understand what is going on in this example; you can find it in the production/examples/eiffel_from_python file. Only the three source code files are listed below:
Example 11-11. The eiffel_from_python test application
The CALLED_FROM_PYTHON Eiffel class
class CALLED_FROM_PYTHON creation make feature make is --dummy creation feature do end print_message is do std_output.put_string( "Hello, calling-eiffel-from-python world!%N" ) end print_integer_addition( a, b : INTEGER ) is do std_output.put_string( a.to_string + " + " + b.to_string + "=" + (a+b).to_string ) end end |
The test_module.py Python module
__doc__ = """ Exists only to test our ability to call Eiffel methods from Python. """ import eiffel_glue import python_shadows def test_eiffel_call( eiffel_object_pointer ) : t = python_shadows.eiffel_CALLED_FROM_PYTHON( eiffel_object_pointer ) print "The following is output from an eiffel object\nscripted by a Python shadow class:" t.print_message() t.print_integer_addition( 1, 42 ) print "\n" |
The TEST Python class
class TEST inherit PYTHON_CLIENT creation make feature make is local test_module : TEST_MODULE a : CALLED_FROM_PYTHON r : PYTHON_OBJECT i : INTEGER p : POINTER s : STRING do initialize_python i := py_run_simple_string( "import sys" ) i := py_run_simple_string( "sys.path.append( '.' )" ) create test_module.make create a.make r := test_module.test_eiffel_call( << swig_pointer_string( a ) >> ) rescue if py_err_occurred.is_not_null then py_err_print end end end |
And when run, produces the following output:
[vputz@yak_prime eiffel_from_python]$ ./test The following is output from an eiffel object scripted by a Python shadow class: Hello, calling-eiffel-from-python world! 1 + 42=43 [vputz@yak_prime eiffel_from_python]$ |