2012-04-10 65 views
1

我需要重新加载指定目录内的所有python模块。重新加载目录中的所有模块

我已经试过这样的事情:

import sys, os 
import_folder = "C:\\myFolder" 
sys.path.insert(0 , import_folder) 
for dir in os.listdir(import_folder): 
    name = os.path.splitext(dir)[0] 
    ext = os.path.splitext(dir)[1] 
    if ext == ".py": 
     import(eval(name)) 
     reload(eval(name)) 

任何人都知道如何正确地做到这一点?

+4

“我需要重新加载指定目录内的所有python模块。” - 为什么? – 2012-04-10 12:18:33

+0

有人希望重新加载目录中的所有模块的一种情况可能是何时输出是时间相关的。例如,如果程序从定期更新的数据库获取数据,并且用户模块未在其内部链接,则将特定目录中的所有模块重新加载可能会非常方便。 – 2012-04-10 12:24:29

+1

@Jack_of_All_Trades:有一点可能是OP的问题更好的解决方案,所以我们需要知道这个问题实际上是什么。顺便说一句,我不明白你描述的用例。 – 2012-04-10 12:29:06

回答

0
import os # we use os.path.join, os.path.basename 
import sys # we use sys.path 
import glob # we use glob.glob 
import importlib # we use importlib.import_module 

import_folder = 'C:\\myFolder' 
sys.path.append(import_folder) # this tells python to look in `import_folder` for imports 
for src_file in glob.glob(os.path.join(import_folder, '*.py')): 
    name = os.path.basename(src_file)[:-3] 
    importlib.import_module(name) 
    reload(sys.modules[name]) 
    importlib.import_module(name) 

有代码。现在到整个事情的语义:使用importlib使得这个更加正常一些,但它仍然会促进一些错误。你可以看到这在一个子目录中的源文件中断了。什么你应该做的是:导入包,(导入整个文件夹),然后使用.运营商,像这样:

import sys # we use sys.path 
sys.path.append('C:\\') 
import myFolder 
... 
myFolder.func1(foo) 
myFolder.val 
bar = myFolder.Class1() 

也许你应该看一看的documentation for modules,但不要忘了更新要包含要导入的文件夹的父项的路径。