How to get full path to script?

K

kj

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
 
M

Mike Driscoll

Note that this doesn't quite work for symbolic links or compiled
scripts, depending on your requirements.

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
 
K

kj

In said:
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
 
M

Mike Driscoll

In said:
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

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
 
S

Sebastian \lunar\ Wiesner

Mike Driscoll said:
In <[email protected]> "Mike Driscoll"
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

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 ;)
 
M

Mike Driscoll

Mike Driscoll said:
In <[email protected]> "Mike Driscoll"

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

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 ;)

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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,575
Members
45,054
Latest member
LucyCarper

Latest Threads

Top