non-standard module location (again)
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Fri Oct 21 13:29:48 EDT 2011
On Fri, 21 Oct 2011 07:05:32 -0700, Shane wrote:
> Need to refine a question I asked earlier. If I have a module,
>
> |-- foo
> |-------|
> |-------|---bar
> |-------|-------|
> |-------|-------|---__init__.py
>
> then I can say import foo.bar
No you can't, not the way you have listed it. As shown, foo is just a
directory, so "import foo" will fail. However, "import bar" may work,
provided foo/bar is in the module search path.
Perhaps you mean you have a package, with a sub-package:
foo/
+-- __init__.py
+-- bar/
... +-- __init__.py
Now you have TWO modules, foo and foo.bar, and you can "import foo.bar"
successfully.
> But suppose I want to import foo.bar.stuff and stuff isn't located on
> under `bar' because it's user
> supplied code:
>
> |- stuff <- I want this to be logically
> under foo.bar
> |-------|---__init__.py <- even though it's not under bar in
> the computer's file system
This is not clear what you are trying to do. Please explain more clearly
what your module layout is.
foo/
+-- __init__.py
+-- stuff.py
+-- bar/
... +-- __init__.py
Or:
stuff.py
foo/
+-- __init__.py
+-- bar/
... +-- __init__.py
But since stuff is supposed to be a plugin, the most obvious, sensible
way to lay out the modules would be:
foo/
+-- __init__.py
+-- plugins/
... +-- __init__.py
... +-- stuff.py
+-- bar/
... +-- __init__.py
and then "import foo.plugins.stuff". Clear, simple and obvious.
> Now what: how to arrange to do command: import foo.bar.stuff
Why do you want to call it foo.bar.stuff when it isn't actually
foo.bar.stuff? Anyone trying to debug this will hate you, when they try
to find a module foo/bar/stuff.py and can't find it because it doesn't
exist.
If you must play games with module locations, put this inside the
foo/bar/__init__.py module:
import foo.plugins.stuff as stuff
and now you can say "import foo.bar.stuff". But why bother?
Of course, plugin discovery is still a problem, but that's still a
problem no matter what you do. Best to use a well-tested plugin library
instead of trying to invent your own.
--
Steven
More information about the Python-list
mailing list