Carregamento do módulo dinâmico Python com base na entrada
-
24-09-2019 - |
Pergunta
Eu escrevi um programa que recebe um feed RSS parcial e produz um completo, mas é um caso a caso. A receita de um site não é a mesma da receita para a outra. Então, o que eu faço é olhar para o nome de base do domínio (por exemplo, NYT ou WSJ) e escolher um módulo com base nisso. Embora eu precise carregar cada módulo antes da mão e ter uma condição lógica para cada receita.
O que eu preciso é uma maneira de ter apenas os módulos individuais em sua própria pasta e quando eu analiso o nome de base do URL, quero que ele procure o módulo, carregue -o e tome alguma ação. Então, eu quero que a base de código principal seja independente dos módulos. Quero poder adicionar os módulos no futuro e nunca tocar na parte do código que interage com eles.
Aqui está um exemplo de código
if "nyt" == feed:
nyt.parser(posixpath.basename(url), urldir, rss_file_path, url, feed)
Como você pode ver, eu chamo o analisador do módulo individual. Eu tenho muitos deles com base em cada site. Quero feed de palheta e, em seguida, poder procurar o módulo, carregá -lo e chamá -lo e, se não existir, relate -o e tente o método padrão.
Solução
Parece que você está procurando o __import__
função. Esta função faz a mesma coisa que o import
Declaração, mas permite que você passe um nome para importar que só possa ser conhecido em tempo de execução.
Então você pode fazer:
parsemodule = __import__(feed)
parsemodule.parser(posixpath.basename(url), urldir, rss_file_path, url, feed)
Você vai querer capturar exceções como ImportError
.
Outras dicas
Você pode usar o módulo IMP.