Here's how to find all the modules in some directory, and import them.
Finding Modules in a Directory
Is there a better way than just listing the contents of the directory, and taking those tiles that end with ".pyc" or ".py"..?
But perhaps there isn't.
1 import os 2 3 def find_modules(path="."): 4 """Return names of modules in a directory. 5 6 Returns module names in a list. Filenames that end in ".py" or 7 ".pyc" are considered to be modules. The extension is not included 8 in the returned list. 9 """ 10 modules = set() 11 for filename in os.listdir(path): 12 module = None 13 if filename.endswith(".py"): 14 module = filename[:-3] 15 elif filename.endswith(".pyc"): 16 module = filename[:-4] 17 if module is not None: 18 s.add(module) 19 return list(modules)
Importing the Modules
How do you import a module, once you have it's name?
With the ImpModule! It dynamically loads named modules.
Finding the Things Inside a Module
Once you have your module, you can look inside it, with .__dict__.
Finding Functions Within a Module
We just look for dictionary values that are of type types.FunctionType.
The DocXmlRpcServer page includes code demonstrating the use of these techniques.
I got this error when executing find_modules() in a package directory. That is the directory contained an __init.py__ file:
File "C:\Python254\lib\site-packages\joedorocak\find_modules.py", line 27, in find_modules s.add(module) NameError: global name 's' is not defined
It looks to me like s needs to be initialized (some place near "modules = set()"). I'm not sure what the protocol is here, so I'm just going to leave this comment in the discussion.
Here's what seems to work for me. I got rid of 's' altogether.
def find_modules(path="."): """Return names of modules in a directory. Returns module names in a list. Filenames that end in ".py" or ".pyc" are considered to be modules. The extension is not included in the returned list. """ modules = set() for filename in os.listdir(path): module = None if filename.endswith(".py"): module = filename[:-3] elif filename.endswith(".pyc"): module = filename[:-4] if module is not None: modules.add(module) return list(modules)
All the best,