Этот ответ является дополнением к ответу Себастьяна Риттау, отвечающему на комментарий: «а что, если у вас нет имени модуля?» Это быстрый и грязный способ получения вероятного имени модуля python по имени файла - он просто идет вверх по дереву, пока не найдет каталог без файла __init__.py
, а затем превратит его обратно в имя файла. Для Python 3.4+ (использует pathlib), что имеет смысл, поскольку пользователи Py2 могут использовать «imp» или другие способы выполнения относительного импорта:
import pathlib
def likely_python_module(filename):
'''
Given a filename or Path, return the "likely" python module name. That is, iterate
the parent directories until it doesn't contain an __init__.py file.
:rtype: str
'''
p = pathlib.Path(filename).resolve()
paths = []
if p.name != '__init__.py':
paths.append(p.stem)
while True:
p = p.parent
if not p:
break
if not p.is_dir():
break
inits = [f for f in p.iterdir() if f.name == '__init__.py']
if not inits:
break
paths.append(p.stem)
return '.'.join(reversed(paths))
Конечно, есть возможности для улучшения, и необязательные файлы __init__.py
могут потребовать других изменений, но если у вас есть __init__.py
в целом, это делает свое дело.