guidance needed: best practice for script packaging
Josiah Carlson
josiah.carlson at sbcglobal.net
Tue Jun 26 23:50:22 EDT 2007
Alan Isaac wrote:
> This is a simple question about actual practice.
> I just want to know how you (yes you) are
> approaching this problem.
> The problem:
> What is the recommended packaging of
> demo scripts or test scripts for a package
> to be distributed to others to "play with".
> (I.e., without "installing".)
>
> Example:
> Suppose I have the package structure:
>
> package/
> __init__.py
> subpackage1/
> __init__.py
> moduleXX.py
> subpackage2/
> __init__.py
> moduleYY.py
>
> Important detail:
> moduleXX uses a relative import to access moduleYY.
>
> The goal:
> I have a script test.py that I want to
> distribute with the package. This script will import
> moduleXX to illustrate or test the module's use.
>
> Is it the case that this script cannot reasonably be
> bundled with `package`? (I.e., within its directory
> structure.)
>
> Note:
> If I put it in the `subpackage1` directory and
> just import moduleXX, I will get
> ValueError: Attempted relative import in non-package
>
> Note:
> If I put it in the `package` directory and
> import subpackage1.moduleXX, I will get
> ValueError: Attempted relative import beyond toplevel package
>
> Here is one hack, based on a suggestion of Alex Martelli
> http://mail.python.org/pipermail/python-list/2007-May/438250.html
> and others.
> - add a `scripts` subdirectory to `package`
> - use path manipulation to find the directory holding `package`
> - insert this directory in sys.path
>
> This hack "works".
> However it has also been claimed that this approach is an
> insane for any shared code. Is it? If so, what is best practice?
I have used this method more than once to get around the fact that
relative imports don't work the way I want them to in this situation.
Alternatively, you could use...
package/
__init__.py #for 'import package'
test.py
shared/
__init__.py
subpackage1/
__init__.py
moduleXX.py
subpackage2/
__init__.py
moduleYY.py
And always run scripts from the package/... path or from something that
is able to 'import package'. It does force a layer of useless
namespace, but it works.
- Josiah
More information about the Python-list
mailing list