好久没更新博客,而且最近一直都有其他的事情在忙,今天闲下来更新一篇,说说我在开发中遇到的那二三事。
Python中若要动态加载某目录下的子模块。。一直都没找到什么好的解决方法,一开始自己写的代码是这样的:
main.pymod_list = {}
for filename in os.listdir('mod'):
if filename.endswith('py'):
for line in open(os.path.join('mod',filename)):
eval(line)
# do something behind
mod/md.pymarkdown_template = '"# %(title)s
Author: %(author)s
Create Date: %(created_time)s
Last Update: %(updated_time)s
%(content)s
"'
def markdown(self):
return markdown_template % self
mod_list ['md'] = markdown
期望是能够在mian中do something 之后能够在class内通过mod_list.get('md')()来运行markdown函数,然而,运行失败。。
于是我到处找其他解决方法,除了静态和硬替换以及加入注册函数之外没能找到更好方法,因此在回过头来思考为什么出错。
通过日志能够发现在eval读取到的mod文件的第一行就出错了,再一查eval只能执行一行表达式,于是将main.py中的eval换成能执行多行的exec,成功运行。
错就错在方法和经验式上了,js的eval是js的,不是python的,python的exec才等于js的eval。