[Baypiggies] Locating the directory you are executing from

Kelly Yancey kelly at nttmcl.com
Wed May 7 09:15:35 CEST 2008


Atul Varma wrote:
> Kelly,
> 
> I think one nice thing about using __file__ is that it doesn't 
> necessarily require your Python file to be the main script that's being 
> executed, as sys.argv[0] does.  For instance, I could have my own script 
> called "foo", and then import "bar", which loads something relative to 
> its (i.e., bar's) location in the filesystem.  If "bar" uses 
> sys.argv[0], it would find the path to foo, but if it uses __file__, it 
> will always find the correct path regardless of whether it's imported as 
> a module or run as a script.
> 
> - Atul
> 

   Atul,

   That makes sense.  I've only ever needed the path to the main 
executable so I never noticed.  But now that you mention it, I can 
imagine scenarios where you might need a path to a source file other 
than the main executable.  Thanks,

   Kelly

> On Tue, May 6, 2008 at 10:22 PM, Kelly Yancey <kelly at nttmcl.com 
> <mailto:kelly at nttmcl.com>> wrote:
> 
>     Shannon -jj Behrens wrote:
> 
>         On Sun, May 4, 2008 at 1:15 PM, Aahz <aahz at pythoncraft.com
>         <mailto:aahz at pythoncraft.com>> wrote:
> 
>             On Sun, May 04, 2008, Jeff Younker wrote:
>              >
>              > I have a set of development scripts.  The scripts can
>             potentially
>              > be executed from many places.  They reference information
>             which is
>              > relative to their installation paths.  (These are build
>             scripts.)
>              >
>              > The CI system can supply a fixed root, but when run by
>             the developers
>              > I'd like them to be runnable from anywhere in the
>             project, and still
>              > have them work.
> 
>              If you're willing to require that the script directory NOT
>             be on the
>              path, just do some manipulation of sys.argv[0].  Otherwise,
>             __file__ is
>              the right approach.
> 
> 
>         Heh, I have this same problem ;)
> 
>         -jj
> 
> 
>      Here is the snippet I've been using.  It supports running both as a
>     python script and as a binary created by py2exe.  It also works on
>     systems that return paths encoded with with non-ASCII character sets
>     (e.g. non-U.S. version of Windows).
> 
>        import locale
>        import os
>        import sys
> 
>        if hasattr(sys, 'frozen'):
>            # Running as executable generated by py2exe.
>            runpath = sys.executable
>        else:
>            # Running as python script.
>            runpath = sys.argv[0]
>        rundir = os.path.dirname(unicode(runpath,
>                                         locale.getpreferredencoding()))
> 
>      I am curious though: how is extracting the path from __file__
>     better than extracting it from sys.argv[0]?  The best I can tell
>     (from simple test scripts) is that both yield the same results.
> 
>      Kelly
> 
>     -- 
>     Kelly Yancey
>     http://kbyanc.blogspot.com/
> 
>     _______________________________________________
>     Baypiggies mailing list
>     Baypiggies at python.org <mailto:Baypiggies at python.org>
>     To change your subscription options or unsubscribe:
>     http://mail.python.org/mailman/listinfo/baypiggies
> 
> 



More information about the Baypiggies mailing list