problem with packages and path

Paul Boddie paul at boddie.org.uk
Fri Aug 29 15:15:24 EDT 2008


On 29 Aug, 19:08, Daniel <daniel.watr... at gmail.com> wrote:
>
> I have tried running both commands above from the mypackage directory
> and unittests directory.  I get the following response universtally.
>
> C:\mypackage>dir
>  Volume in drive C is Default
>
>  Directory of C:\mypackage
>
> 08/29/2008  11:04 AM    <DIR>          .
> 08/29/2008  11:04 AM    <DIR>          ..
> 08/29/2008  11:05 AM    <DIR>          module1
> 08/29/2008  11:05 AM    <DIR>          module2
> 08/29/2008  11:06 AM    <DIR>          unittests
> 08/29/2008  11:04 AM                 0 __init__.py
>                1 File(s)              0 bytes
>                5 Dir(s)  55,402,070,016 bytes free

If you run unittests\alltests.py from here, sys.path will initially
refer to this directory (C:\mypackage) and to anything else set up in
your environment. The extra path modification that you put in
alltests.py will append (or insert) the following...

   os.path.normpath( os.path.join( __file__, "../../" ))
-> os.path.normpath( os.path.join( "C\\:mypackage\\unittests\
\alltests.py", "../../" ))
-> os.path.normpath( "C\\:mypackage" )
-> "C\\:mypackage"

Since the import statement then tries to access mypackage, which isn't
itself in the C:\mypackage directory - it's in the C:\ directory - the
import fails. The previous, automatically added entry in sys.path is
duplicated by the path modifications shown above, so that won't help
here, either.

> C:\mypackage>dir unittests
>  Volume in drive C is Default
>
>  Directory of C:\mypackage\unittests
>
> 08/29/2008  11:06 AM    <DIR>          .
> 08/29/2008  11:06 AM    <DIR>          ..
> 08/29/2008  11:05 AM                 0 alltests.py
> 08/29/2008  11:05 AM                 0 test1.py
> 08/29/2008  11:05 AM                 0 test2.py
> 08/29/2008  11:04 AM                 0 __init__.py
>                4 File(s)              0 bytes
>                2 Dir(s)  55,401,988,096 bytes free

Here, sys.path should refer to C:\mypackage\unittests somewhere, which
won't help Python find mypackage. The path modification in alltests.py
should perform as above, producing C:\mypackage which won't help.

I guess the easiest thing to do is to change the path modification
code to use "../../.." which should produce a reference to C:\ instead
of C:\mypackage. The confusion with this particular piece of the code
is the way ".." doesn't cause os.path.join to operate on the directory
C:\mypackage\unittests but instead on the file C:\mypackage\unittests
\alltests.py - that's almost to be expected, however, since
os.path.join doesn't really know that its first argument is really a
file or that ".." is being combined with a file.

What I tend to do, especially with __file__, is to first use
os.path.split to remove the filename - strictly speaking, it's the
leafname - and then to apply the kind of modifications mentioned
above, although there's probably no real difference or, indeed, any
advantage with either approach.

Paul



More information about the Python-list mailing list