我的目录结构如下:
| main.py
| scripts
|--| __init__.py
| script1.py
| script2.py
| script3.py
从main.py
导入模块scripts
。我尝试将pkgutils.walk_packages
与__all__
结合使用,但是使用它,我只能使用from scripts import *
导入main
下的所有子模块。我想把它们都放在scripts
下面。导入scripts
的所有子模块以便我可以从main
访问scripts.script1
的最干净的方法是什么?
编辑:很抱歉我有点含糊。我希望在运行时导入子模块,而不在__init__.py
中显式指定它们。我可以使用pkgutils.walk_packages
来获取子模块名称(除非有人知道更好的方法),但是我不确定使用这些名称的最干净的方法(或者walk_packages
返回的ImpImporters?)以导入它们。
编辑:以下是一种在运行时递归导入所有内容的方法。。。
(顶层包目录中
__init__.py
的内容)我没有在这里使用
__import__(__path__+'.'+module_name)
,因为使用它很难正确地递归地导入包。如果您没有嵌套的子包,并且希望避免使用globals()[module_name]
,那么这是一种方法。也许有更好的办法,但无论如何,这是我能做的最好的办法。
原始答案(对于上下文,忽略其他方面。我最初误解了这个问题):
你的
scripts/__init__.py
长什么样?应该是这样的:你甚至可以不定义
__all__
,但是如果你定义了它(pydoc,如果没有其他东西的话),即使它只是你导入的内容的列表,它的工作也会更干净。简单地工作,并允许在包内进行相对导入:
用法:
这是基于the answer that kolypto provided,但他的答案不执行包的递归导入,而这是基于the answer that kolypto provided。尽管主问题不需要递归导入,但我相信递归导入适用于许多类似的情况,并且非常有用。一、 首先,在搜索主题时发现了这个问题。
这是执行子包模块导入的一种好的、干净的方法,而且应该是可移植的,并且它使用了Python2.7+/3.x的标准库
用法:
相关问题 更多 >
编程相关推荐