How to get full path to script?

Discussion in 'Python' started by kj, Jun 8, 2008.

  1. kj

    kj Guest

    How can a script know its absolute path? (__file__ only gives the
    path it was used to invoke the script.)

    Basically, I'm looking for the Python equivalent of Perl's FindBin.

    The point of all this is to make the scripts location the reference
    point for the location of other files, as part of a self-contained
    distribution.

    TIA!

    Kynn

    --
    NOTE: In my address everything before the first period is backwards;
    and the last period, and everything after it, should be discarded.
     
    kj, Jun 8, 2008
    #1
    1. Advertising

  2. kj

    kj Guest

    In <> "Mark Tolonen" <> writes:

    >import os
    >print os.path.abspath(__file__)


    Great. Thanks!

    Kynn

    --
    NOTE: In my address everything before the first period is backwards;
    and the last period, and everything after it, should be discarded.
     
    kj, Jun 8, 2008
    #2
    1. Advertising

  3. kj

    bukzor Guest

    On Jun 8, 12:52 pm, kj <> wrote:
    > In <> "Mark Tolonen" <> writes:
    >
    > >import os
    > >print os.path.abspath(__file__)

    >
    > Great.  Thanks!
    >
    > Kynn
    >
    > --
    > NOTE: In my address everything before the first period is backwards;
    > and the last period, and everything after it, should be discarded.


    Note that this doesn't quite work for symbolic links or compiled
    scripts, depending on your requirements.
     
    bukzor, Jun 9, 2008
    #3
  4. On Mon, Jun 9, 2008 at 12:37 AM, bukzor <> wrote:
    > On Jun 8, 12:52 pm, kj <> wrote:
    >> In <> "Mark Tolonen" <> writes:
    >>
    >> >import os
    >> >print os.path.abspath(__file__)

    >>
    >> Great. Thanks!
    >>
    >> Kynn
    >>
    >> --
    >> NOTE: In my address everything before the first period is backwards;
    >> and the last period, and everything after it, should be discarded.

    >
    > Note that this doesn't quite work for symbolic links or compiled
    > scripts, depending on your requirements.
    > --
    > http://mail.python.org/mailman/listinfo/python-list
    >


    For my compiled scripts, I usually use this variation:

    path = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0])))

    It's always worked for me.

    Mike
     
    Mike Driscoll, Jun 9, 2008
    #4
  5. kj

    kj Guest

    In <> "Mike Driscoll" <> writes:

    >For my compiled scripts, I usually use this variation:


    >path = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0])))


    Thanks. But why the os.path.join()? (BTW, I did read the docs
    before posting, but they make no sense to me; they say that
    os.path.join joins "one or more path components intelligently",
    but what does it mean to join *one* component?)

    Kynn

    --
    NOTE: In my address everything before the first period is backwards;
    and the last period, and everything after it, should be discarded.
     
    kj, Jun 9, 2008
    #5
  6. On Mon, Jun 9, 2008 at 11:07 AM, kj <> wrote:
    > In <> "Mike Driscoll" <> writes:
    >
    >>For my compiled scripts, I usually use this variation:

    >
    >>path = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0])))

    >
    > Thanks. But why the os.path.join()? (BTW, I did read the docs
    > before posting, but they make no sense to me; they say that
    > os.path.join joins "one or more path components intelligently",
    > but what does it mean to join *one* component?)
    >
    > Kynn
    >
    > --
    > NOTE: In my address everything before the first period is backwards;
    > and the last period, and everything after it, should be discarded.
    > --
    > http://mail.python.org/mailman/listinfo/python-list
    >


    The idea of the join method is to create the path in an OS agnostic
    fashion. Linux uses forward slashes and Windows uses backward slashes
    to join the parts. The join method does this for you so you don't have
    to.

    I think in this case, if I had my program installed to

    C:\Program Files\MyProgram

    It would put the slashes in correctly for Windows. However, there are
    ways to get the default program directory in Linux and then have the
    os.path.join create the path correctly there too. That's the idea
    anyway. Hopefully that isn't more confusing than what you read.

    Mike
     
    Mike Driscoll, Jun 9, 2008
    #6
  7. Mike Driscoll <> at Montag 09 Juni 2008 18:20:

    > On Mon, Jun 9, 2008 at 11:07 AM, kj <> wrote:
    >> In <> "Mike Driscoll"
    >> <> writes:
    >>
    >>>For my compiled scripts, I usually use this variation:

    >>
    >>>path = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0])))

    >>
    >> Thanks. But why the os.path.join()? (BTW, I did read the docs
    >> before posting, but they make no sense to me; they say that
    >> os.path.join joins "one or more path components intelligently",
    >> but what does it mean to join *one* component?)
    >>
    >> Kynn
    >>
    >> --
    >> NOTE: In my address everything before the first period is backwards;
    >> and the last period, and everything after it, should be discarded.
    >> --
    >> http://mail.python.org/mailman/listinfo/python-list
    >>

    >
    > The idea of the join method is to create the path in an OS agnostic
    > fashion. Linux uses forward slashes and Windows uses backward slashes
    > to join the parts. The join method does this for you so you don't have
    > to.


    I guess, you didn't get his point. He seems to be aware that os.path.join
    creates a path from _multiple_ strings by joining them with the correct
    separator used by the underlying platform.

    But he was asking why one would invoke os.path.join on a _single_ string, as
    you did in your example. I'm wondering about this, too. It doesn't make
    sense to me. os.path.join doesn't convert existing separators to the
    platform-specific ones. And even if it would, sys.argv[0] already contains
    a correct path, so there is nothing that needs conversion. So why use it
    with a _single_ argument? I'd appreciate an example, illustrating the use
    of this ;)


    --
    Freedom is always the freedom of dissenters.
    (Rosa Luxemburg)
     
    Sebastian \lunar\ Wiesner, Jun 9, 2008
    #7
  8. On Mon, Jun 9, 2008 at 12:42 PM, Sebastian lunar Wiesner
    <> wrote:
    > Mike Driscoll <> at Montag 09 Juni 2008 18:20:
    >
    >> On Mon, Jun 9, 2008 at 11:07 AM, kj <> wrote:
    >>> In <> "Mike Driscoll"
    >>> <> writes:
    >>>
    >>>>For my compiled scripts, I usually use this variation:
    >>>
    >>>>path = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0])))
    >>>
    >>> Thanks. But why the os.path.join()? (BTW, I did read the docs
    >>> before posting, but they make no sense to me; they say that
    >>> os.path.join joins "one or more path components intelligently",
    >>> but what does it mean to join *one* component?)
    >>>
    >>> Kynn
    >>>
    >>> --
    >>> NOTE: In my address everything before the first period is backwards;
    >>> and the last period, and everything after it, should be discarded.
    >>> --
    >>> http://mail.python.org/mailman/listinfo/python-list
    >>>

    >>
    >> The idea of the join method is to create the path in an OS agnostic
    >> fashion. Linux uses forward slashes and Windows uses backward slashes
    >> to join the parts. The join method does this for you so you don't have
    >> to.

    >
    > I guess, you didn't get his point. He seems to be aware that os.path.join
    > creates a path from _multiple_ strings by joining them with the correct
    > separator used by the underlying platform.
    >
    > But he was asking why one would invoke os.path.join on a _single_ string, as
    > you did in your example. I'm wondering about this, too. It doesn't make
    > sense to me. os.path.join doesn't convert existing separators to the
    > platform-specific ones. And even if it would, sys.argv[0] already contains
    > a correct path, so there is nothing that needs conversion. So why use it
    > with a _single_ argument? I'd appreciate an example, illustrating the use
    > of this ;)
    >
    >
    > --
    > Freedom is always the freedom of dissenters.
    > (Rosa Luxemburg)
    > --
    > http://mail.python.org/mailman/listinfo/python-list
    >


    Okay, basically the answer is that I'm kind of stupid. Months ago, the
    users on the wxPython group were discussing this issue and one of them
    posted that snippet of code to show how they worked around the issue.
    I thought I'd try it and it worked great, although I couldn't really
    follow what was happening at the time.

    Looking at it now, there doesn't appear to be any reason for the
    os.path.join part. I tried running one of my simple scripts with and
    without it and they return the same string.

    I apologize for propagating erroneous code.

    Mike
     
    Mike Driscoll, Jun 9, 2008
    #8
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. PHaroZ
    Replies:
    5
    Views:
    95,596
    akash02sap
    Aug 17, 2012
  2. Benjamin Han
    Replies:
    7
    Views:
    497
    Hartmut Goebel
    Jan 3, 2004
  3. gmax2006
    Replies:
    7
    Views:
    627
    John Machin
    Aug 31, 2006
  4. dude
    Replies:
    5
    Views:
    1,783
    Jussi Piitulainen
    Mar 17, 2011
  5. sm
    Replies:
    3
    Views:
    127
    Tad McClellan
    Jan 26, 2006
Loading...

Share This Page