2015-08-18 8 views
3

Как я могу автозагрузить все мои модули, хранящиеся в разных каталогах и подкаталогах?Автозагрузчик модулей Python?

Я видел это answer, который использует __import__, но это все еще не автозагрузка, которую я имею в виду.

Я думаю что-то похожее на PHP autoloader. Еще лучше что-то вроде Composer autoloader.

Похоже, что автозагрузчик не является популярным в Python из исследования, которое я собрал до сих пор (не могу быть уверенным, поскольку я новичок в Python). Является ли автозагрузка чем-то неуправляемым в Python?

Мой автозагрузку код до сих пор,

import os 
import sys 

root = os.path.dirname(__file__) 
sys.path.append(root + "/modules") 
sys.path.append(root + "/modules/User") 
sys.path.append(root + "/modules/Article") 

# IMPORTS MODULES 
module = __import__("HelloWorld") 
my_class = getattr(module, "HelloWorld") 

# This is our application object. It could have any name, 
# except when using mod_wsgi where it must be "application" 
def application(environ, start_response): 

    results = [] 

    helloWorld = my_class() 
    results.append(helloWorld.sayHello()) 

    output = "<br/>".join(results) 

    print output 

    ... 

Как вы можете видеть, что я по-прежнему необходимо иметь эти строки, чтобы загрузить модули,

sys.path.append(root + "/modules") 
sys.path.append(root + "/modules/User") 
sys.path.append(root + "/modules/Article") 

Что делать, если у меня есть тонны папок и подпапки? Я собираюсь перечислить их всех? В конце концов, это длинный список, не так ли?

Кроме того, с помощью __import__ кажется, не имеет большого отличия от этого,

import os 
import sys 

root = os.path.dirname(__file__) 
sys.path.append(root + "/modules") 
sys.path.append(root + "/modules/User") 
sys.path.append(root + "/modules/Article") 

# IMPORTS MODULES 
import hello 
import HelloWorld 

from HelloWorld import HelloWorld 

# This is our application object. It could have any name, 
# except when using mod_wsgi where it must be "application" 
def application(environ, start_response): 

Последнее выглядит лучше и аккуратнее меня.

Любые идеи?

+0

извините, удалил свой комментарий. не был уверен, что это может помочь. в основном добавьте файлы '__init __. py' в папки. http://stackoverflow.com/questions/13215386/creating-python-packages –

+0

все в порядке. Может быть, я должен посмотреть, как превратить эти модули в пакет? У меня уже есть '__init __. Py' в каждой папке. – laukok

+0

, то у вас уже есть пакет и вы можете импортировать его из 'modules.User import HelloWorld' (или sth вроде этого). только путь, где 'modules' может быть найден, должен находиться в' PYTHONPATH'. –

ответ

4

TL; DR: Забудьте об этом и используйте явный импорт.

Более длинный ответ:

Python не PHP - ни с технической, ни POV от дизайна/философский.

Части философии Python (так называемые «Python's Zen») являются «явными, лучше, чем неявные», «Чтение числа отсчетов» и «перед лицом двусмысленности, отказаться от соблазна угадать» - что делает «особенность» как «Автозагрузка» PHP очень несовместима, так как она менее понятна, чем «import mymodule» или «from mymodule import SomeName», 2. она также менее читаема (вы не знаете четко, откуда импортируется имя) и 3. когда два или более модуля определяют одно и то же имя (что совершенно правильно и довольно часто встречается в Python), ему придется попытаться угадать, какой из них вы хотите (что было бы технически невозможно).

Из технического POV вы не можете реализовать такую ​​функцию в Python надежным способом - cf пункт 3. выше. В то время как оператор PHP require и оператор import Python могут выглядеть схожими, они действительно работают совершенно по-другому, а «модели исполнения» также совершенно разные.

+0

Что такое «POV» и «cf»? – laukok

+0

POV = точка зрения? – laukok

+1

@teelou «POV» = «точка зрения», «cf» = «см.» –

3

Я просто повторю @ bruno «не делай этого». Это не стоит того, но я хотел бы добавить, почему именно:

Является ли автозагрузка чем-то неуправляемым в Python?

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

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

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

+0

Простите, что такое «opcodes»? – laukok

+1

«При вычислении код операции (сокращенно от кода операции) является частью инструкции машинного языка, которая указывает операцию, которая должна быть выполнена» (https://en.wikipedia.org/wiki/Opcode). Большинство «интерпретируемых» языков используют промежуточное представление байт-кода (т. Е. Файлы Python «.pyc»). –

2

Автоматическая перезагрузка исходного кода таким образом, что PHP это не практично в Python. Я хотел бы предложить вам пойти, прочитанный из:

Если вы действительно должны иметь что-то, увидеть детали автоматического кода перегружатель вы можете использовать с mod_wsgi, описанной в этом. Однако никогда не используйте его в производственной системе.

Если вы занимаетесь разработкой, вам, откровенно говоря, может быть лучше использовать mod_wsgi-express. См:

Одна из вещей mod_wsgi-Экспресс является --reload-on-changes вариант, который реализует автоматический код перегрузочный для вас.