Импортируйте модуль Python без .py расширения

У меня есть файл, названный foobar (без .py расширения). В том же каталоге у меня есть другой файл Python, который пытается импортировать его:

import foobar

Но это только работает, если я переименовываю файл к foobar.py. Действительно ли возможно импортировать модуль Python, который не имеет .py расширения?

Обновление: файл не имеет никакого расширения, потому что я также использую его в качестве автономного сценария, и я не хочу вводить .py расширение для выполнения его.

Update2: Я пойду для решения для символьной ссылки, упомянутого ниже.

61
задан 10 April 2010 в 00:24

1 ответ

importlib функция помощника

Вот является удобным, готовым к использованию помощником для замены imp с примером, на основе того, что было упомянуто в: https://stackoverflow.com/a/43602645/895245

main.py

#!/usr/bin/env python3

import os
import importlib

def import_path(path):
    module_name = os.path.basename(path).replace('-', '_')
    spec = importlib.util.spec_from_loader(
        module_name,
        importlib.machinery.SourceFileLoader(module_name, path)
    )
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    sys.modules[module_name] = module
    return module

notmain = import_path('not-main')
print(notmain)
print(notmain.x)

не - основной

x = 1

Выполнение:

python3 main.py

Вывод:

<module 'not_main' from 'not-main'>
1

я заменяю - _, потому что мои разрешенные к ввозу исполняемые файлы Python без расширения имеют дефисы. Это не обязательно, но производит лучшие имена модуля.

Этот шаблон также упоминается в документах в: https://docs.python.org/3.7/library/importlib.html#importing-a-source-file-directly

я закончил тем, что переместился в него, потому что после обновления к Python 3.7, import imp печатает:

DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses

и я не знаю, как выключить это.

Протестированный в Python 3.7.3.

1
ответ дан 31 October 2019 в 16:13

Другие вопросы по тегам:

Похожие вопросы: