从目录动态导入包

时间:2011-09-29 10:40:28

标签: python

我正在制作一个侦听套接字的服务器。每当有新请求进入时,服务器就会产生一个新的handle_request实例。 handle_request.py 的每个实例都从request_handlers中导入相关的处理程序

server.py
handle_request.py
request_handlers
|_handler_beta
|_handler_1
|_handler_2

虽然handlerX是一个模块,但request_handlers不是包。这些模块是自包含的,并在每个请求上重新加载。程序运行时可以添加,修改或删除模块。


问题:从任意目录导入模块的方法是什么?


做我的作业,我看到大多数问题涉及,甚至一个标题为“ python:从文件夹导入模块”。因此我相信这个问题是截然不同的。该架构已经简化;是的,我正在考虑通过重新加载来修改文件。

2 个答案:

答案 0 :(得分:2)

在目录中创建__init__.py。这使它成为一个包。如果您正在扫描.py文件的目录,那么您可能希望跳过__init__.py

然后,您可以使用__import__('request_handlers.' + module, fromlist=[''])导入它们(fromlist很重要,否则您将获得request_handlers而不是相应的模块。

在没有__init__.py的情况下执行此操作的一种方法是将request_handlers目录放在sys.path中,但这会使名称与其他模块发生冲突。另一种方式是使用execfile。如果你愿意,你可以研究更多。我会这样做(之前已经完成了)package / __ import__方式。

答案 1 :(得分:0)

正如克里斯所说:在你的文件夹中添加__init__.py。如果您事先不知道名称或者您不希望在代码中修改其名称,则可以使用__import__()功能。