У меня есть структура каталогов следующим образом:
| main.py
| scripts
|--| __init__.py
| script1.py
| script2.py
| script3.py
От main.py
, модуль scripts
импортируется. Я пытался использовать pkgutils.walk_packages
в сочетании с __all__
, но с помощью этого, я могу только импортировать все подмодули непосредственно под main
использование from scripts import *
. Я хотел бы получить их всех под scripts
. Из чего был бы самый чистый способ импортировать все подмодули scripts
так, чтобы я мог получить доступ scripts.script1
от main
?
Править: Я сожалею, что был немного неопределенен. Я хотел бы импортировать подмодули на времени выполнения, не указывая их явно в __init__.py
. Я могу использовать pkgutils.walk_packages
для получения имен подмодуля (если кто-то не знает о лучшем пути) но я не уверен в самом чистом способе использовать эти имена (или возможно ImpImporters это walk_packages
возвраты?) для импорта их.
Редактировать: Вот один из способов рекурсивного импорта всего во время выполнения...
(Содержимое __init__.py
в каталоге верхнего пакета)
import pkgutil
__all__ = []
for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
__all__.append(module_name)
_module = loader.find_module(module_name).load_module(module_name)
globals()[module_name] = _module
Я не использую __import__(__path__+'.'+имя_модуля)
здесь, так как трудно правильно рекурсивно импортировать пакеты с его помощью. Однако если у вас нет вложенных подпакетов, и вы хотите избежать использования globals()[имя_модуля]
, то это один из способов сделать это.
Возможно, есть лучший способ, но это лучшее, что я могу сделать, в любом случае.
Оригинальный ответ (Для контекста, игнорируйте othwerwise. Я неправильно понял вопрос изначально):
Как выглядит ваш scripts/__init__.py
? Это должно быть что-то вроде:
import script1
import script2
import script3
__all__ = ['script1', 'script2', 'script3']
Вы даже можете обойтись без определения __all__
, но вещи (pydoc, если ничего другого) будут работать более чисто, если вы определите его, даже если это будет просто список того, что вы импортировали.
Я писал небольшую личную библиотеку и все время добавлял новые модули, поэтому я написал сценарий оболочки для поиска сценариев и создания __ init __. Py
' с. Скрипт выполняется вне основного каталога моего пакета pylux.
Я знаю, что, вероятно, это не тот ответ, который вы ищете, но он выполнил свою задачу для меня и может быть полезен кому-то еще.
#!/bin/bash
echo 'Traversing folder hierarchy...'
CWD=`pwd`
for directory in `find pylux -type d -exec echo {} \;`;
do
cd $directory
#echo Entering $directory
echo -n "" > __init__.py
for subdirectory in `find . -type d -maxdepth 1 -mindepth 1`;
do
subdirectory=`echo $subdirectory | cut -b 3-`
#echo -n ' ' ...$subdirectory
#echo -e '\t->\t' import $subdirectory
echo import $subdirectory >> __init__.py
done
for pyfile in *.py ;
do
if [ $pyfile = $(echo __init__.py) ]; then
continue
fi
#echo -n ' ' ...$pyfile
#echo -e '\t->\t' import `echo $pyfile | cut -d . -f 1`
echo import `echo $pyfile | cut -d . -f 1` >> __init__.py
done
cd $CWD
done
for directory in `find pylux -type d -exec echo {} \;`;
do
echo $directory/__init__.py:
cat $directory/__init__.py | awk '{ print "\t"$0 }'
done