Document implicit namespace packages for python
This commit is contained in:
parent
32304449f9
commit
cd2c7b9245
1 changed files with 71 additions and 0 deletions
|
|
@ -5865,6 +5865,77 @@ class Bar(pkg3.foo.Foo): pass
|
|||
effect (note, that the Python 2 case also needs the <tt>-relativeimport</tt>
|
||||
workaround).</p>
|
||||
|
||||
<H3>Implicit Namespace Packages</H3>
|
||||
|
||||
<p> Python 3.3 intoduced
|
||||
<a href="https://www.python.org/dev/peps/pep-0420/">PEP 0420</a> which
|
||||
implements implicit namespace packages. In a nutshell, implicit namespace
|
||||
packages remove the requirement of an __init__.py file and allow packages
|
||||
to be split across multiple PATH elements. For example:
|
||||
</p>
|
||||
|
||||
<div class="diagram">
|
||||
<pre>
|
||||
/fragment1/pkg1/mod1.py
|
||||
/fragment2/pkg1/mod2.py
|
||||
/fragment3/pkg1/mod3.py
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p>If PYTHONPATH is set to "/fragment1:/fragment2:/fragment3", then mod1, mod2
|
||||
and mod3 will be part of pkg1. This allows for splitting of packages into
|
||||
separate pieces. This can be useful for swig generated wrappers in the
|
||||
following way.
|
||||
</p>
|
||||
|
||||
<p> Suppose you create a swig wrapper for a module called robin. The swig
|
||||
generated code consists of two files robin.py and _robin.so. You wish to
|
||||
make these modules part of a subpackage (brave.sir). With implicit namespace
|
||||
packages you can place these files in the following configurations:
|
||||
</p>
|
||||
|
||||
<p>Using PYTHONPATH="/some/path"</p>
|
||||
<div class="diagram">
|
||||
<pre>
|
||||
/some/path/brave/sir/robin.py
|
||||
/some/path/brave/sir/_robin.so
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p>Using PYTHONPATH="/some/path:/some/other/path"
|
||||
|
||||
<div class="diagram">
|
||||
<pre>
|
||||
/some/path/brave/sir/robin.py
|
||||
/some/other/path/brave/sir/_robin.so
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p> Finally suppose that your pure python code is stored in a .zip file or
|
||||
some other way (database, web service connection, etc). Python can load the
|
||||
robin.py module using a custom importer. But the _robin.so module will need
|
||||
to be located on a file system. Implicit namespace packages make this
|
||||
possible. For example, using PYTHONPATH="/some/path/foo.zip:/some/other/path"
|
||||
|
||||
<p> Contents of foo.zip</p>
|
||||
<div class="diagram">
|
||||
<pre>
|
||||
brave/
|
||||
brave/sir/
|
||||
brave/sir/robin.py
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p> File system contents</p>
|
||||
<div class="diagram">
|
||||
<pre>
|
||||
/some/other/path/brave/sir/_robin.so
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p>Support for implicit namespace packages was added to python-3.3. The
|
||||
zipimporter requires python-3.5.1 or newer to work with subpackages.
|
||||
</p>
|
||||
|
||||
<H2><a name="Python_python3support">36.12 Python 3 Support</a></H2>
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue