Если в файле t1 есть метод a.py и есть файл b.py, который вызывает метод t1 из a.py файла. Как получить полный/абсолютный путь к файлу b.py внутри метода t1?
С помощью модуля проверки (как здесь: как получить имя файла вызывающего абонента, имя метода в python) я могу получить относительный путь к файлу, но, похоже, он не содержит абсолютного пути (или есть какой-то другой объект атрибута, к которому можно получить доступ?).
Например:
а.py:
def t1():
print('callers absolute path')
б.пи:
from a import t1
t1() # should print absolute path for `b.py`
Итак, вы спрашиваете, как превратить относительный путь в абсолютный...?
@DirtyBit нет. Чтобы получить путь a.py, вы просто используете __file__ или sys.path[0]. Но мне нужен путь вызывающего абонента, а не путь вызываемого метода.
@Aran-Fey Если он не возвращает абсолютный путь, то да. Интересно, будет ли использование комбинации с os.path.realpath всегда возвращать правильный абсолютный путь? Причина Функция realpath объединяет текущий рабочий каталог с относительным путем.
__file__ всегда является допустимым путем, то есть да, он относится к текущему рабочему каталогу. (Если вы не изменили CWD в своем коде, но тогда это ваша вина...)






Вы можете получить его с помощью модуля os в Python.
>>> import a
>>> os.path.abspath(a.__file__)
Это даст вам путь к текущему файлу, а не к файлу вызывающих абонентов.
С помощью модуля os вы можете сделать следующее:
а.ру
import os
def t1(__file__):
print(os.path.abspath(__file__))
б.пи
from a import t1
t1(__file__) # shoult print absolute path for `b.py`
При этом вы можете вызвать t1(__file__ и получить абсолютный путь для любого файла.
Я знаю, но это не то, что мне нужно. Мне нужно получить этот путь внутри a.py. Обеспечить это должно быть задачей a.py, а не b.py.
печать (os.path.abspath («b.py»))
Ну, вам все еще нужно указать имя файла вызывающего абонента, так что ничего хорошего :)
import os
import inspect
def get_cfp(real: bool = False) -> str:
"""Return caller's current file path.
Args:
real: if True, returns full path, otherwise relative path
(default: {False})
"""
frame = inspect.stack()[1]
p = frame[0].f_code.co_filename
if real:
return os.path.realpath(p)
return p
Запуск из другого модуля:
from module import my_module
p1 = my_module.get_cfp()
p2 = my_module.get_cfp(real=True)
print(p1)
print(p2)
Отпечатки:
test_path/my_module_2.py
/home/user/python-programs/test_path/my_module_2.py
Использование sys._getframe():
a1.py:
import sys
def t1():
print(sys._getframe().f_code)
a2.py:
from a1 import t1
t1() # should print absolute path for `b.py`
Следовательно:
py -m a2.py
ВЫХОД:
<code object t1 at 0x0000029BF394AB70, file "C:\Users\dirtybit\PycharmProjects\a1.py", line 2>
РЕДАКТИРОВАТЬ:
Использование inspect:
a1.py:
import inspect
def t1():
print("Caller: {}".format(inspect.getfile(inspect.currentframe())))
a2.py:
from a1 import t1
t1() # should print absolute path for `b.py`
ВЫХОД:
Caller: C:\Users\dirtybit\PycharmProjects\a1.py
Хитрость заключается в восстановлении как текущего рабочего каталога а также, так и относительного пути относительно этого каталога к вызывающему файлу (здесь b.py). Объединение делает все остальное.
а.py:
import os
import sys
def t1():
namespace = sys._getframe(1).f_globals
cwd = os.getcwd()
rel_path = namespace['__file__']
abs_path= os.path.join(cwd,rel_path)
print('callers absolute path!',abs_path)
б.пи:
from a import t1
t1() # prints absolute path for `b.py`
Трюк не работает для ноутбуков Jupyter, к сожалению.
Разве
t1()не должен возвращать абсолютный путь дляa.py?