我正在编写一个Python应用程序,它将命令作为参数,例如:
$ python myapp.py command1
Run Code Online (Sandbox Code Playgroud)
我希望应用程序是可扩展的,即能够添加实现新命令的新模块,而无需更改主应用程序源.树看起来像:
myapp/
__init__.py
commands/
__init__.py
command1.py
command2.py
foo.py
bar.py
Run Code Online (Sandbox Code Playgroud)
所以我希望应用程序在运行时找到可用的命令模块并执行适当的命令模块.
Python定义了一个__import__函数,它接受一个模块名称的字符串:
__import __(name,globals = None,locals = None,fromlist =(),level = 0)
该函数导入模块名称,可能使用给定的全局变量和局部变量来确定如何解释包上下文中的名称.fromlist给出了应该从name给出的模块导入的对象或子模块的名称.
所以目前我有类似的东西:
command = sys.argv[1]
try:
command_module = __import__("myapp.commands.%s" % command, fromlist=["myapp.commands"])
except ImportError:
# Display error message
command_module.run()
Run Code Online (Sandbox Code Playgroud)
这很好用,我只是想知道是否可能有更惯用的方法来完成我们正在使用此代码.
请注意,我特别不想使用鸡蛋或扩展点.这不是一个开源项目,我不希望有"插件".重点是简化主应用程序代码,并在每次添加新命令模块时无需修改它.
我正在研究嵌套matplotlib(MPL)库的文档(个人),它与MPL自己提供的有趣的子模块包不同.我正在编写Python脚本,我希望将从未来的MPL版本中自动生成文档.
我选择了感兴趣的子模块/包,并希望列出我将生成列表并处理它的主要类pydoc
问题是我找不到一种方法来指示Python从字符串加载子模块.这是我尝试的例子:
import matplotlib.text as text
x = dir(text)
Run Code Online (Sandbox Code Playgroud)
.
i = __import__('matplotlib.text')
y = dir(i)
Run Code Online (Sandbox Code Playgroud)
.
j = __import__('matplotlib')
z = dir(j)
Run Code Online (Sandbox Code Playgroud)
以下是通过pprint对上述列表进行3种比较:

我不明白在y对象中加载了什么- 它是基础matplotlib加上其他东西,但它缺少我想要的信息,而且它是matplotlib.text包中的主要类.这是截图(x列表)中的顶级蓝色部分
请不要建议Sphinx采用不同的方法.
我知道我可以用来importlib通过字符串导入模块.如何import *使用此库重新创建功能?基本上,我想要这样的东西:
importlib.import_module('path.to.module', '*')
Run Code Online (Sandbox Code Playgroud)
我没有对导入的属性进行名称间隔的原因是故意的.
假设我们有两个 python 文件(例如file_1.py和file_2.py),其结构如下:
-- file_1.py
# file_1.py imports file_2
fo(x) # a function
A # a class
fun(y) # some method
_bo(y) # some "hidden" method
-- file2.py
bar(x) # a function
Run Code Online (Sandbox Code Playgroud)
我想要一些像get_functions_and_methods('file_1.py')这样的输出的函数:
'fo(x)', 'a.fun(y)', 'a._bo(y)'
Run Code Online (Sandbox Code Playgroud)
鉴于我是 Python 新手,我不知道如何构建此类信息,并且很乐意获得帮助。
我在网上找到的最接近的是:
__import__(从此处:使用字符串作为名称导入文件)导入 .py 文件,它似乎不起作用。问题是我不仅想捕获所有的 def,而且还想将它们连接到嵌入其中的类。我应该如何解决这个问题?谢谢!