[Tutor] Configuaration files and paths?
Martin Walsh
mwalsh at mwalsh.org
Sun Aug 9 21:07:05 CEST 2009
Allen Fowler wrote:
>>> FWIW:
>>>
>>> When using relative paths I got extra ../../ terms, so I changed
>> join_relative() to:
>>> def join_relative(base, path):
>>> return os.path.normpath(os.path.join(script_dir(base), path))
>>>
>>>
>>> Seems to work...
>>
>> Yeah, good catch ... looks great, and thanks for sharing your mod.
>>
>
>
> Glad I could return the favor. :)
>
> Since then, I took it a bit further for use in my code... I am not finished with it yet, but am curios what you think. (I am not sure named things right or structured it logically....)
>
>
> ###################
>
> import os
> class HomePath(object):
> """For finding paths based on a home/install directory.
>
> """
>
> def __init__(self, home_dir = None, home_file = None):
> """Must be called with either a path to a directory or, as a shortcut, a file in that directory.
>
> """
>
> if home_file != None:
> # Set home based on a path to a file in its directory
> self.home = os.path.normpath(self.fix_path(home_file))
>
> elif home_dir != None:
> # Set home based on its path
> self.home = os.path.normpath(self.get_dir(home_dir))
>
> else:
> raise Exception("Must call with either a path to a directory or, as a shortcut, a file in that directory.")
>
> def abs(self, rel_from_home):
> """Return an absolute path when passed a path relative to home.
>
> """
>
> return self.join_relative(self.home, rel_from_home)
>
> def fix_path(self, base):
> return os.path.realpath(os.path.abspath(base))
>
> def get_dir(self, base):
> return os.path.dirname(self.fix_path(base))
>
> def join_relative(self, base, path):
> return os.path.normpath(self.fix_path(os.path.join(self.home, path)))
> #############################
I'm not sure I understand your end goal, given the args to __init__. I'd
guess, perhaps incorrectly, that you may be trying to shoehorn
conflicting purposes.
If your only aim is to calculate an absolute path to a resource's
parent, or home, folder then your class can be simplified a lot, IMHO.
Specifically, I don't see a reason to differentiate between home_dir and
home_file. Please feel free to clarify if I'm missing the point.
import os
class HomePath(object):
def __init__(self, path):
# fix_path and get_dir on base path
self.home = os.path.dirname(
os.path.realpath(
os.path.abspath(path)
)
)
def join(self, relative_path):
return os.path.normpath(os.path.join(self.home, relative_path))
Also, have a look at
http://docs.python.org/library/os.path.html#os.path.abspath
... the main point is that your initial path element must have enough
information in it to construct an abspath, otherwise os.getcwd() can
pollute the calculation. I believe if you use __file__ you're good, and
sys.argv[0], while potentially relative in nature should always be
relative to os.getcwd() AFAICT, so you're good there too. Otherwise
avoid constructing a HomePath object with a relative start path.
HTH,
Marty
More information about the Tutor
mailing list