summaryrefslogtreecommitdiff
path: root/Examples/python
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2018-12-08 22:31:26 +0000
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2018-12-08 22:31:26 +0000
commit51dadaeacde6de32ab945ef0c930e1f3d95f2ae0 (patch)
tree9a7b14bd519f58823966e6178291e852dcf2639f /Examples/python
parentb19d3e06b3132b0c212fd2fb8c2ceb5cc1cac263 (diff)
downloadswig-51dadaeacde6de32ab945ef0c930e1f3d95f2ae0.tar.gz
Add example to test the Python module being renamed to __init__.py
This examples tests the SWIG generated module being placed into a directory and then renamed __init__.py to convert the module into a package. This ability stopped working in swig-3.0.9. However, only Python 2.7 or 3.3 and later work. If Python 3.2 support is needed, use moduleimport in %module to customise the import code. Issue #1282
Diffstat (limited to 'Examples/python')
-rw-r--r--Examples/python/import_packages/Makefile1
-rw-r--r--Examples/python/import_packages/module_is_init/Makefile15
-rw-r--r--Examples/python/import_packages/module_is_init/README18
-rw-r--r--Examples/python/import_packages/module_is_init/pkg1/Makefile20
-rw-r--r--Examples/python/import_packages/module_is_init/pkg1/foo.hpp10
-rw-r--r--Examples/python/import_packages/module_is_init/pkg1/foo.i5
-rw-r--r--Examples/python/import_packages/module_is_init/runme.py26
7 files changed, 95 insertions, 0 deletions
diff --git a/Examples/python/import_packages/Makefile b/Examples/python/import_packages/Makefile
index 2857866d4..c7f9a830b 100644
--- a/Examples/python/import_packages/Makefile
+++ b/Examples/python/import_packages/Makefile
@@ -8,6 +8,7 @@ import_packages_subdirs = \
from_init1 \
from_init2 \
from_init3 \
+ module_is_init \
relativeimport1 \
relativeimport2 \
relativeimport3 \
diff --git a/Examples/python/import_packages/module_is_init/Makefile b/Examples/python/import_packages/module_is_init/Makefile
new file mode 100644
index 000000000..43763aa4b
--- /dev/null
+++ b/Examples/python/import_packages/module_is_init/Makefile
@@ -0,0 +1,15 @@
+TOP = ../../..
+LIBS =
+
+check: build
+ $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' python_run
+
+build:
+ cd pkg1 && $(MAKE) SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' build
+
+static:
+ cd pkg1 && $(MAKE) SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' static
+
+clean:
+ $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' python_clean
+ cd pkg1 && $(MAKE) clean
diff --git a/Examples/python/import_packages/module_is_init/README b/Examples/python/import_packages/module_is_init/README
new file mode 100644
index 000000000..ee7391cda
--- /dev/null
+++ b/Examples/python/import_packages/module_is_init/README
@@ -0,0 +1,18 @@
+This example tests renaming the generated SWIG pure Python module to __init__.py
+to turn the module into a Python package.
+
+Use 'python runme.py' to run the test.
+
+Overview:
+---------
+
+SWIG generates a pure Python module foo.py from the input interface file foo.i.
+The foo.py file is generated within the pkg1 directory and is then renamed __init__.py.
+This results in everything in the SWIG generated module being available in the Python
+pkg1 package.
+
+This approach of turning the SWIG generated module into a package worked in versions
+of SWIG up to swig-3.0.8, but stopped working from swig-3.0.9 until it was
+re-instated in swig-4.0.0. However, Python 2.7 or 3.3 and later are needed to
+work out of the box. Python 3.2 does not work as this version of Python does
+not set __package__ in __init__.py.
diff --git a/Examples/python/import_packages/module_is_init/pkg1/Makefile b/Examples/python/import_packages/module_is_init/pkg1/Makefile
new file mode 100644
index 000000000..d9d83ed0a
--- /dev/null
+++ b/Examples/python/import_packages/module_is_init/pkg1/Makefile
@@ -0,0 +1,20 @@
+TOP = ../../../..
+SWIGEXE = $(TOP)/../swig
+SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib
+SWIGOPT =
+LIBS =
+
+build:
+ $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' \
+ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \
+ SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' TARGET='foo' INTERFACE='foo.i' python_cpp
+ mv foo.py __init__.py
+
+static:
+ $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' \
+ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \
+ SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' TARGET='foo' INTERFACE='foo.i' python_cpp_static
+
+clean:
+ $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' TARGET='foo' python_clean
+ rm -f __init__.py
diff --git a/Examples/python/import_packages/module_is_init/pkg1/foo.hpp b/Examples/python/import_packages/module_is_init/pkg1/foo.hpp
new file mode 100644
index 000000000..01c462266
--- /dev/null
+++ b/Examples/python/import_packages/module_is_init/pkg1/foo.hpp
@@ -0,0 +1,10 @@
+
+int foofunction(int i) {
+ return i *= 10;
+}
+
+struct FooClass {
+ int foomethod(int i) {
+ return i += 5;
+ }
+};
diff --git a/Examples/python/import_packages/module_is_init/pkg1/foo.i b/Examples/python/import_packages/module_is_init/pkg1/foo.i
new file mode 100644
index 000000000..f8d71380c
--- /dev/null
+++ b/Examples/python/import_packages/module_is_init/pkg1/foo.i
@@ -0,0 +1,5 @@
+%module foo
+%{
+#include "./foo.hpp"
+%}
+%include "./foo.hpp"
diff --git a/Examples/python/import_packages/module_is_init/runme.py b/Examples/python/import_packages/module_is_init/runme.py
new file mode 100644
index 000000000..b5e646e85
--- /dev/null
+++ b/Examples/python/import_packages/module_is_init/runme.py
@@ -0,0 +1,26 @@
+import os.path
+import sys
+
+# Test import of a SWIG generated module renamed as the package's __init__.py
+testname = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
+print "Testing " + testname + " - module renamed as __init__.py"
+
+if sys.version_info >= (3, 0, 0) and sys.version_info < (3, 3, 0):
+ print " Not importing as Python version is >= 3.0 and < 3.3"
+ # Package detection does not work in these versions.
+ # Can be fixed by using this in the interface file:
+ # %module(moduleimport="from . import $module") foo # without -builtin
+ # %module(moduleimport="from .$module import *") foo # with -builtin
+ sys.exit(0)
+
+import pkg1
+print " Finished importing pkg1"
+
+if pkg1.foofunction(123) != 1230:
+ raise RuntimeError("foofunction failed")
+
+fc = pkg1.FooClass()
+if fc.foomethod(1) != 6:
+ raise RuntimeError("foomethod failed")
+
+print " Finished testing pkg1"