Динамическая загрузка модуля Python на основе ввода - PullRequest
1 голос
/ 02 февраля 2010

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 02 февраля 2010

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

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

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

Вам захочется ловить исключения, такие как ImportError.

1 голос
/ 02 февраля 2010

Вы можете использовать модуль imp .

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