Create ioutils.py
This commit is contained in:
parent
b4040956f1
commit
1da3add7d3
45
src/shared_libs/ioutils.py
Normal file
45
src/shared_libs/ioutils.py
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#!/usr/bin/env python3.6
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
IO stuff.
|
||||||
|
"""
|
||||||
|
import inspect
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ('in_here',)
|
||||||
|
|
||||||
|
|
||||||
|
def in_here(*path_bits: str, stack_depth: int=0) -> str:
|
||||||
|
"""
|
||||||
|
A somewhat voodooish and weird piece of code. This enables us to
|
||||||
|
directly refer to a file in the same directory as the code that
|
||||||
|
calls this method, without any due regard for where in the file
|
||||||
|
system tree it is.
|
||||||
|
|
||||||
|
Apart from that, this will behave just like os.path.join, meaning
|
||||||
|
that varaidic strings will be joined with the appropriate
|
||||||
|
directory separator for the current platform.
|
||||||
|
|
||||||
|
This works by inspecting the stack frame for the caller.
|
||||||
|
If you are planning on nesting this call in another utility and wish
|
||||||
|
for the stack to refer to that caller, you should increment
|
||||||
|
the ``stack_depth`` arg for each nested call you make. By default,
|
||||||
|
you can ignore this and it will default to 0.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
frame = inspect.stack()[1 + nested_by]
|
||||||
|
except IndexError:
|
||||||
|
raise RuntimeError('Could not find a stack record. Interpreter has '
|
||||||
|
'been shot.')
|
||||||
|
else:
|
||||||
|
module = inspect.getmodule(frame[0])
|
||||||
|
assert hasattr(module, '__file__'), 'No __file__ attr, whelp.'
|
||||||
|
|
||||||
|
file = module.__file__
|
||||||
|
|
||||||
|
dir_name = os.path.dirname(file)
|
||||||
|
abs_dir_name = os.path.abspath(dir_name)
|
||||||
|
|
||||||
|
return os.path.join(abs_dir_name, *paths)
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user