• 8

A PHP Error was encountered

Severity: Notice

Message: Undefined index: userid

Filename: views/question.php

Line Number: 191


File: /home/prodcxja/public_html/questions/application/views/question.php
Line: 191
Function: _error_handler

File: /home/prodcxja/public_html/questions/application/controllers/Questions.php
Line: 433
Function: view

File: /home/prodcxja/public_html/questions/index.php
Line: 315
Function: require_once

name Punditsdkoslkdosdkoskdo

How to get the parent dir location

this code is get the templates/blog1/page.html in b.py:

path = os.path.join(os.path.dirname(__file__), os.path.join('templates', 'blog1/page.html'))

but i want to get the parent dir location:

   |  |---b.py
   |      |---templates
   |              |--------blog1
   |                         |-------page.html

and how to get the aParent location



this is right:

path = os.path.join(dirname(dirname(__file__)), os.path.join('templates', 'blog1/page.html'))


path = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
      • 2
    • os.path.join('templates', 'blog1/page.html') looks strange to me. You are mixing things up. Either os.path.join('templates', 'blog1', 'page.html') or 'templates/blog1/page.html'. And much easier would be os.path.abspath(os.path.join('templates', 'blog1', 'page.html')) then
      • 2
    • @zjm: no, you don't get that page. It's not some blackbox that you could just use to get the template file. It performs a series of trivial small steps, and if you could understand them, you wouldn't have this question.

You can apply dirname repeatedly to climb higher: dirname(dirname(file)). This can only go as far as the root package, however. If this is a problem, use os.path.abspath: dirname(dirname(abspath(file))).

  • 169
Reply Report
    • I know the OP knows about dirname. It isn't obvious to everyone that applying dirname to a directory yields the parent directory.
      • 1
    • @Sridhar: That depends on your perspective; I consider a path ending in / as not representing the leaf directory entry itself, but its contents, which is why, e.g., mv xxx yyy/ fails if yyy isn't a preexisting directory. In any case, even if we take your point as a given, it is irrelevant in the context of my answer. Neither file nor the result of dirname will ever end in a /.
      • 2
    • Minor correction: dirname may return '/', which clearly ends in a /. That is the only exception, AFAIK.

os.path.abspath doesn't validate anything, so if we're already appending strings to __file__ there's no need to bother with dirname or joining or any of that. Just treat __file__ as a directory and start climbing:

# climb to __file__'s parent's parent:
os.path.abspath(__file__ + "/../../")

That's far less convoluted than os.path.abspath(os.path.join(os.path.dirname(__file__),"..")) and about as manageable as dirname(dirname(__file__)). Climbing more than two levels starts to get ridiculous.

But, since we know how many levels to climb, we could clean this up with a simple little function:

uppath = lambda _path, n: os.sep.join(_path.split(os.sep)[:-n])

# __file__ = "/aParent/templates/blog1/page.html"
>>> uppath(__file__, 1)
>>> uppath(__file__, 2)
>>> uppath(__file__, 3)
  • 55
Reply Report
    • This is nice, but it would also be cool if the standard library added a convenience function that accomplished this...don't want to come to SO every time I need this func

Use relative path with the pathlib module in Python 3.4+:

from pathlib import Path


You can use multiple calls to parent to go further in the path:


As an alternative to specifying parent twice, you can use:

  • 40
Reply Report

Should give you the path to a.

But if b.py is the file that is currently executed, then you can achieve the same by just doing

os.path.abspath(os.path.join('templates', 'blog1', 'page.html'))
  • 12
Reply Report

Here is another relatively simple solution that:

  • does not use dirname() (which does not work as expected on one level arguments like "file.txt" or relative parents like "..")
  • does not use abspath() (avoiding any assumptions about the current working directory) but instead preserves the relative character of paths

it just uses normpath and join:

def parent(p):
    return os.path.normpath(os.path.join(p, os.path.pardir))

# Example:
for p in ['foo', 'foo/bar/baz', 'with/trailing/slash/', 
        'dir/file.txt', '../up/', '/abs/path']:
    print parent(p)


  • 1
Reply Report

I think use this is better:

os.path.realpath(__file__).rsplit('/', X)[0]

In [1]: __file__ = "/aParent/templates/blog1/page.html"

In [2]: os.path.realpath(__file__).rsplit('/', 3)[0]
Out[3]: '/aParent'

In [4]: __file__ = "/aParent/templates/blog1/page.html"

In [5]: os.path.realpath(__file__).rsplit('/', 1)[0]
Out[6]: '/aParent/templates/blog1'

In [7]: os.path.realpath(__file__).rsplit('/', 2)[0]
Out[8]: '/aParent/templates'

In [9]: os.path.realpath(__file__).rsplit('/', 3)[0]
Out[10]: '/aParent'
  • 0
Reply Report

Trending Tags