<div dir="ltr"><div>Hello python devs.</div><div>One thing which appears to be pretty common in many scripts is figuring out module's parent directory path. </div><div>I often find myself writing:</div><div><br></div><div>

<div>HERE = os.path.abspath(os.path.dirname(__file__))<br></div><div><br></div><div>...at the top of a module. </div><div>Also, it is not rare to do further concatenations in order to declare where static files are located:</div>

<div><br></div><div>CONF_FILE = os.path.abspath(os.path.join(HERE, 'app.conf'))<br></div><div>CERT_FILE = os.path.abspath(os.path.join(HERE, 'cert.pem'))<br></div><div><div>THIS_FILE = os.path.abspath(os.path.join(HERE, __file__))</div>

</div><div><br></div><div>A quick search within Python source code shows this is indeed a very common pattern:</div><div><br></div><div>$ find . -name \*.py | xargs grep "os\.path" | grep __file__<br></div><div>

<br></div><div>Just some examples (there are *many*):</div><div><br></div><div><div><a href="http://hg.python.org/cpython/file/186f6f56f4bc/Lib/distutils/tests/__init__.py#l21">http://hg.python.org/cpython/file/186f6f56f4bc/Lib/distutils/tests/__init__.py#l21</a><br>

</div></div><div><a href="http://hg.python.org/cpython/file/186f6f56f4bc/PCbuild/build_tkinter.py#l11">http://hg.python.org/cpython/file/186f6f56f4bc/PCbuild/build_tkinter.py#l11</a><br></div><div><a href="http://hg.python.org/cpython/file/186f6f56f4bc/PCbuild/build_ssl.py#l68">http://hg.python.org/cpython/file/186f6f56f4bc/PCbuild/build_ssl.py#l68</a><br>

</div><div><a href="http://hg.python.org/cpython/file/186f6f56f4bc/Tools/msi/uisample.py#l2">http://hg.python.org/cpython/file/186f6f56f4bc/Tools/msi/uisample.py#l2</a><br></div><div><a href="http://hg.python.org/cpython/file/186f6f56f4bc/Lib/distutils/tests/test_config_cmd.py#l30">http://hg.python.org/cpython/file/186f6f56f4bc/Lib/distutils/tests/test_config_cmd.py#l30</a><br>

</div><div><a href="http://hg.python.org/cpython/file/186f6f56f4bc/Lib/unittest/test/testmock/__main__.py#l7">http://hg.python.org/cpython/file/186f6f56f4bc/Lib/unittest/test/testmock/__main__.py#l7</a><br></div><div><a href="http://hg.python.org/cpython/file/186f6f56f4bc/Lib/pydoc.py#l2463">http://hg.python.org/cpython/file/186f6f56f4bc/Lib/pydoc.py#l2463</a><br>

</div><div><br></div><div>I think there's space for improvements here so my proposal is to add a simple os.path.here() function working like this:</div><div><br></div><div>>>> # assuming /home/giampaolo/app/run.py is the current module:</div>

<div>>>> os.path.here()<br></div><div>/home/giampaolo/app/</div><div><div>>>> os.path.here(__file__)</div><div>/home/giampaolo/app/run.py</div></div><div><div><div>>>> os.path.here('..')</div>

<div>/home/giampaolo/</div></div></div><div><br></div><div>The implementation is pretty straightforward:</div><div><br></div><div><div>def here(concat=None):</div><div>    """Return the absolute path of the parent directory where the </div>

<div>    script is defined.</div><div>    """</div><div>    here = os.path.abspath(os.path.dirname(__file__))</div><div>    if concat is not None:</div><div>        here = os.path.abspath(os.path.join(here, concat))</div>

<div>    return here</div></div><div><br></div><div>Thoughts?</div><div><br></div><div><br></div>-- <br><div dir="ltr"><div>Giampaolo - <a href="http://grodola.blogspot.com" target="_blank">http://grodola.blogspot.com</a></div>

<div><br></div></div>
</div></div>