Как импортировать все подмодули?

У меня есть структура каталогов следующим образом:

| 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 возвраты?) для импорта их.

36
задан linkmaster03 12 August 2014 в 15:32
поделиться

2 ответа

Редактировать: Вот один из способов рекурсивного импорта всего во время выполнения...

(Содержимое __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, если ничего другого) будут работать более чисто, если вы определите его, даже если это будет просто список того, что вы импортировали.

34
ответ дан 27 November 2019 в 05:36
поделиться

Я писал небольшую личную библиотеку и все время добавлял новые модули, поэтому я написал сценарий оболочки для поиска сценариев и создания __ 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
0
ответ дан 27 November 2019 в 05:36
поделиться
Другие вопросы по тегам:

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