From: Samuele P. <ped...@bl...> - 2002-10-18 20:28:33
|
From: "Robert Wentworth" <rh...@er...> > Synopsis: Would I be correct in inferring that the Jython path mechanism > only works if the different nodes along the path contain completely > non-overlapping package structures? Is there any way around this? > > --- > > I had been planning on encouraging the use of "python.path" in our > Jython development environment. Developers would work in a local image > of the Jython directory hierarchy, but would also reference a standard > version of the same directory hierarchy. (In a C/C++ environment, you > might refer to this as developing using a "view path", with transparent > overlapping "layers" of directories and files.) It turns out that this > usage apparently doesn't work in Jython, at least not in an environment > where we want to use a non-trivial package structure to organize our > modules. > > Let me provide some examples. For all examples, suppose python.path has > been set such that sys.path == ['/A', '/B']. > > Suppose that /A contains a directory /A/X with files __init__.py and > xena.py, while /B contains a directory /B/Y with files __init__.py and > yankee.py. Then, as expected, one can "import X.xena" and "import > Y.yankee". So far so good. > > But, if instead /A contains directory /A/R with file __init__.py and > directory /A/R/X with files __init__.py and xena.py, while /B contains > directory /B/R with file __init__.py and directory /B/R/Y containing > __init__.py and yankee.py. Then "import R.X.xena" succeeds, but "import > R.Y.yankee" fails. Interestingly, both "import R.X" and "import R.Y" > succeed. > > I've tried tinkering with not including the (empty) __init__.py file in > some directories, but this hasn't improved the situation. > > So, it appears that the Jython path mechanism only works if the > different nodes along the path contain completely non-overlapping > package structures. > > Am I missing anything? jython package behavior comes straight from Python. Basically a package maps to the first __init__.py in an appropriate named directory found along sys.path search. OTOH when searching for modules inside a package an optional list of paths bound to __path__ in __init__.py module will be searched. So you can have /A/X /A/X/__init__.py /B/X and have in /A/X/__init__.py __path__ = ['/A/X','/B/X'] Btw at the beginning of __init__.py execution __path__ is automatically bound by default to a list with only the containing dir: print __path__ at the top of __init__.py would show that. regards. See also http://www.python.org/doc/essays/packages.html |