2011-09-29 118 views
0

我正在一個服務器上偵聽一個套接字。每當有新的請求進入時,服務器都會生成一個新的handle_request實例。 handle_request.py的每個實例從request_handlers中導入相關處理程序從目錄動態導入一個包

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

雖然handlerX是一個模塊,request_handlers不是包。這些模塊是獨立的,並在每個請求中重新加載。程序運行時可能會添加,修改或刪除模塊。


問題:什麼是從任意目錄中導入一個模塊的方式嗎?


做功課,我看到的大多數問題處理,甚至一個標題爲「蟒蛇:從文件夾導入模塊」。因此我相信這個問題是不同的。架構已經簡化;是的,我正在考慮在文件修改時重新加載預分支。

回答

2

在該目錄中創建__init__.py。這使它成爲一個包裝。如果您正在掃描.py文件的目錄,則可能會跳過__init__.py

然後,你可以用__import__('request_handlers.' + module, fromlist=[''])(fromlist是重要的,否則你會得到request_handlers而不是相應的模塊)導入它們。

一種不使用__init__.py的方法是將request_handlers目錄放入sys.path,但這樣會使名稱與其他模塊發生衝突。另一種方式將與execfile。如果你願意,你可以研究更多。我會這樣做(並且之前已經完成)package/__ import__的方式。

+0

我曾嘗試__import __('request_handlers.default_handler',fromlist = ['']),它導入了default_handler,但沒有其屬性 – aitchnyu

+0

你是什麼意思,「沒有它的屬性」?你得到模塊中有任何東西的模塊對象。 –

+0

>>> import request_handlers.default_handler as dh >>> dir(dh) ['__ builtins__','__ doc__','__ file__','__ name__','__ package__','__ path__'] – aitchnyu

0

正如Chris所說:將__init__.py添加到您的文件夾。如果您事先不知道名稱,或者您不想在代碼中固定其名稱,則可以使用__import__()函數。