Examples (and tests) for python namespace packages
This commit is contained in:
parent
23d2eb555f
commit
ba158e7919
12 changed files with 133 additions and 2 deletions
|
|
@ -10,7 +10,8 @@ import_packages_subdirs = \
|
||||||
from_init3 \
|
from_init3 \
|
||||||
relativeimport1 \
|
relativeimport1 \
|
||||||
relativeimport2 \
|
relativeimport2 \
|
||||||
relativeimport3
|
relativeimport3 \
|
||||||
|
namespace_pkg
|
||||||
|
|
||||||
check: build
|
check: build
|
||||||
if test "x$(SRCDIR)" != x; then \
|
if test "x$(SRCDIR)" != x; then \
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,4 @@
|
||||||
These are actually regression tests for SF bug #1297 (GH issue #7).
|
These are actually regression tests for SF bug #1297 (GH issue #7).
|
||||||
|
The namespace_pkg is an example of python3's namespace packages.
|
||||||
|
|
||||||
See individual READMEs in subdirectories.
|
See individual READMEs in subdirectories.
|
||||||
20
Examples/python/import_packages/namespace_pkg/Makefile
Normal file
20
Examples/python/import_packages/namespace_pkg/Makefile
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
TOP = ../../..
|
||||||
|
PY3 = 1
|
||||||
|
SWIGEXE = $(TOP)/../swig
|
||||||
|
SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib
|
||||||
|
SRCS = robin.c
|
||||||
|
TARGET = robin
|
||||||
|
INTERFACE = robin.i
|
||||||
|
|
||||||
|
check: build
|
||||||
|
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' PY3='$(PY3)' python_run
|
||||||
|
|
||||||
|
build:
|
||||||
|
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SRCS='$(SRCS)' \
|
||||||
|
PY3='$(PY3)' \
|
||||||
|
SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \
|
||||||
|
TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' python
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' TARGET='$(TARGET)' python_clean
|
||||||
|
rm -rf path1 path2 path3 path4.zip
|
||||||
25
Examples/python/import_packages/namespace_pkg/README
Normal file
25
Examples/python/import_packages/namespace_pkg/README
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
This is an example (and test) of using swig generated modules in the context
|
||||||
|
of python3's namespace packages:
|
||||||
|
|
||||||
|
https://www.python.org/dev/peps/pep-0420/
|
||||||
|
|
||||||
|
Consequently, this example requires python (3.3 or newer) to build and run.
|
||||||
|
|
||||||
|
This example creates a simple swig module named robin. The robin.py module
|
||||||
|
has a companion C module named _robin.so. The robin module is tested in four
|
||||||
|
ways:
|
||||||
|
|
||||||
|
1) As a non-package module (tested by nonpkg.py)
|
||||||
|
|
||||||
|
2) With robin.py and _robin.so in the brave package under the path1
|
||||||
|
subdirectory. (tested by normal.py)
|
||||||
|
|
||||||
|
3) With robin.py in path2/brave and _robin.so in path3/brave
|
||||||
|
(tested by split.py)
|
||||||
|
|
||||||
|
4) With robin.py contained in a zip file (path4.zip) as brave/robin.py and
|
||||||
|
_robin.so found on the filesystem under path3/brave (tested by zipsplit.py)
|
||||||
|
|
||||||
|
Note: Using namespace packages with subpackages (such as brave.sir.robin) where
|
||||||
|
robin.py is located in a zipfile requires python-3.5.1 or newer as
|
||||||
|
python's zipimporter only worked with packages of depth 1 until then.
|
||||||
5
Examples/python/import_packages/namespace_pkg/nonpkg.py
Normal file
5
Examples/python/import_packages/namespace_pkg/nonpkg.py
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
# import robin as a module in the global namespace
|
||||||
|
|
||||||
|
import robin
|
||||||
|
|
||||||
|
assert(robin.run() == "AWAY!")
|
||||||
7
Examples/python/import_packages/namespace_pkg/normal.py
Normal file
7
Examples/python/import_packages/namespace_pkg/normal.py
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
import sys
|
||||||
|
# Package brave found under one path
|
||||||
|
sys.path.insert(0, 'path1')
|
||||||
|
|
||||||
|
from brave import robin
|
||||||
|
|
||||||
|
assert(robin.run() == "AWAY!")
|
||||||
3
Examples/python/import_packages/namespace_pkg/robin.c
Normal file
3
Examples/python/import_packages/namespace_pkg/robin.c
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
const char *run(void) {
|
||||||
|
return "AWAY!";
|
||||||
|
}
|
||||||
7
Examples/python/import_packages/namespace_pkg/robin.i
Normal file
7
Examples/python/import_packages/namespace_pkg/robin.i
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
%module robin
|
||||||
|
|
||||||
|
%{
|
||||||
|
extern const char *run(void);
|
||||||
|
%}
|
||||||
|
|
||||||
|
const char *run(void);
|
||||||
9
Examples/python/import_packages/namespace_pkg/runme.py
Normal file
9
Examples/python/import_packages/namespace_pkg/runme.py
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
import os, sys, setupPkg
|
||||||
|
|
||||||
|
setupPkg.copyMods()
|
||||||
|
|
||||||
|
# Run each test with a seperate interpreter
|
||||||
|
os.system(sys.executable + " nonpkg.py")
|
||||||
|
os.system(sys.executable + " normal.py")
|
||||||
|
os.system(sys.executable + " split.py")
|
||||||
|
os.system(sys.executable + " zipsplit.py")
|
||||||
34
Examples/python/import_packages/namespace_pkg/setupPkg.py
Normal file
34
Examples/python/import_packages/namespace_pkg/setupPkg.py
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
#---------------------------------
|
||||||
|
# setup the namespace package dirs
|
||||||
|
#---------------------------------
|
||||||
|
import os, shutil, zipfile
|
||||||
|
|
||||||
|
|
||||||
|
def copyMods():
|
||||||
|
dirs = ['path1', 'path2', 'path3']
|
||||||
|
|
||||||
|
# Clean out any old package paths
|
||||||
|
for d in dirs:
|
||||||
|
if os.path.isdir(d):
|
||||||
|
shutil.rmtree(d)
|
||||||
|
|
||||||
|
for d in dirs:
|
||||||
|
os.mkdir(d)
|
||||||
|
os.mkdir(os.path.join(d, 'brave'))
|
||||||
|
|
||||||
|
shutil.copy('robin.py', os.path.join('path1', 'brave'))
|
||||||
|
shutil.copy('_robin.so', os.path.join('path1', 'brave'))
|
||||||
|
|
||||||
|
shutil.copy('robin.py', os.path.join('path2', 'brave'))
|
||||||
|
shutil.copy('_robin.so', os.path.join('path3', 'brave'))
|
||||||
|
|
||||||
|
mkzip()
|
||||||
|
|
||||||
|
def mkzip():
|
||||||
|
zf = zipfile.ZipFile("path4.zip", "w")
|
||||||
|
zf.writestr("brave/", b'')
|
||||||
|
zf.write('robin.py', 'brave/robin.py')
|
||||||
|
zf.close()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
copyMods()
|
||||||
9
Examples/python/import_packages/namespace_pkg/split.py
Normal file
9
Examples/python/import_packages/namespace_pkg/split.py
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
import sys
|
||||||
|
# Package brave split into two paths.
|
||||||
|
# path2/brave/robin.py and path3/brave/_robin.so
|
||||||
|
sys.path.insert(0, 'path2')
|
||||||
|
sys.path.insert(0, 'path3')
|
||||||
|
|
||||||
|
from brave import robin
|
||||||
|
|
||||||
|
assert(robin.run() == "AWAY!")
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
import sys
|
||||||
|
# Package brave split into two paths.
|
||||||
|
# brave/robin.py (in path4.zip) and path3/brave/_robin.so
|
||||||
|
sys.path.insert(0, 'path4.zip')
|
||||||
|
sys.path.insert(0, 'path3')
|
||||||
|
|
||||||
|
from brave import robin
|
||||||
|
|
||||||
|
assert(robin.run() == "AWAY!")
|
||||||
Loading…
Add table
Add a link
Reference in a new issue