Импорт Python: импорт модуля без расширения .py? - PullRequest
3 голосов
/ 19 мая 2009

В системе Python, для которой я разрабатываю, мы обычно имеем эту модульную структуру.

mymodule/
mymodule/mymodule/feature.py
mymodule/test/feature.py

Это позволяет нашей небольшой тестовой среде легко импортировать test / feature.py и запускать модульные тесты. Однако теперь у нас есть необходимость в некоторых сценариях оболочки (написанных на Python):

mymodule/
mymodule/scripts/yetanotherfeature.py
mymodule/test/yetanotherfeature.py

Yetanotherfeature.py устанавливается модулем пакета Debian в / usr / bin. Но нам явно не нужно расширение .py. Итак, для того, чтобы тестовый фреймворк все еще мог импортировать модуль, мне нужно сделать следующую символическую ссылку:

mymodule/
mymodule/scripts/yetanotherfeature
mymodule/scripts/yetanotherfeature.py @ -> mymodule/scripts/yetanotherfeature
mymodule/test/yetanotherfeature.py

Можно ли импортировать модуль по имени файла в Python, или вы можете придумать более элегантное решение для этого?

Ответы [ 4 ]

9 голосов
/ 19 мая 2009

Модуль imp используется для этого:

daniel@purplehaze:/tmp/test$ cat mymodule
print "woho!"
daniel@purplehaze:/tmp/test$ cat test.py 
import imp
imp.load_source("apanapansson", "mymodule")
daniel@purplehaze:/tmp/test$ python test.py
woho!
daniel@purplehaze:/tmp/test$ 
1 голос
/ 19 мая 2009

Скорее всего, вы можете использовать какой-нибудь обманщик, используя ловушки , хотя я бы не советовал. С другой стороны, я бы, вероятно, сделал бы это наоборот, где-нибудь разместил бы ваши скрипты .py и сделал бы символические ссылки на .py для файлов .py. Таким образом, ваша библиотека может быть где угодно, и вы можете запустить тест изнутри, импортировав ее normall (так как она имеет расширение py), а затем / usr / bin / Yetanotherfeature указывает на нее, так что вы можете запустить ее без py.

Редактировать: Не берите в голову это (по крайней мере, часть хуков), решение для импорта imp выглядит очень хорошо для меня:)

1 голос
/ 19 мая 2009

Проверьте модуль Imp:

http://docs.python.org/library/imp.html

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

0 голосов
/ 07 июля 2014

Другой вариант - использовать setuptools:

"... нет простого способа сделать так, чтобы имя файла скрипта совпадало с местными соглашениями на платформах Windows и POSIX. Для другого вам часто приходится создавать отдельный файл только для сценария" main ", когда фактический" main " »- это функция где-то в модуле ... setuptools исправляет все эти проблемы, автоматически генерируя для вас сценарии с правильным расширением, а в Windows он даже создает файл .exe ..."

https://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...