У меня есть файл, названный foobar (без .py расширения). В том же каталоге у меня есть другой файл Python, который пытается импортировать его:
import foobar
Но это только работает, если я переименовываю файл к foobar.py. Действительно ли возможно импортировать модуль Python, который не имеет .py расширения?
Обновление: файл не имеет никакого расширения, потому что я также использую его в качестве автономного сценария, и я не хочу вводить .py расширение для выполнения его.
Update2: Я пойду для решения для символьной ссылки, упомянутого ниже.
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.