2010-02-01 2 views
1

Я написал программу, которая принимает частичный rss-канал и выводит полный, но это один раз в каждом случае. Рецепт для одного сайта не совпадает с рецептом для другого. Итак, что я делаю, посмотрите на базовое имя домена (например, nyt или wsj) и выберите модуль на основе этого. Хотя мне нужно загружать каждый модуль перед рукой и иметь логическое условие для каждого рецепта.Загрузка динамического модуля Python на основе ввода

Что мне нужно - это просто настроить отдельные модули в своей соответствующей папке, а когда я проанализирую базовое имя URL-адреса, я хочу, чтобы он искал модуль, загружал его и предпринимал некоторые действия. Поэтому я хочу, чтобы основная база кода была независимой от модулей. Я хочу иметь возможность добавлять модули в будущем и никогда не прикасаться к части кода, которая взаимодействует с ними.

Вот пример кода

if "nyt" == feed: 
     nyt.parser(posixpath.basename(url), urldir, rss_file_path, url, feed) 

Как вы можете видеть, что я называю парсер отдельного модуля. У меня их много на каждом сайте. Я хочу использовать канал, а затем иметь возможность искать модуль, загружать его и вызывать, а затем, если он не существует, сообщите об этом и попробуйте метод по умолчанию.

ответ

3

Похоже, что вы ищете функцию __import__. Эта функция выполняет то же самое, что и оператор import, но позволяет передавать имя для импорта, которое может быть известно только во время выполнения.

Так что вы можете сделать:

parsemodule = __import__(feed) 
parsemodule.parser(posixpath.basename(url), urldir, rss_file_path, url, feed) 

Вы хотите, чтобы поймать исключения, такие как ImportError.

Смежные вопросы