尽管此处使用的名称与问题的目录结构中显示的名称不同,但是您可以使用我对名为Namespacing和classes的问题的答案。在
__init__.py这里所示本来还允许
usepackage.py脚本已经这样写的(
package映射到
subdir你的问题,并
Class1以
myclass01等):
from package import *print Class1print Class2print Class3
修订(更新):
糟糕,抱歉,我的其他答案中的代码并未完全满足您的要求-
它只会自动导入任何程序包子模块的名称。为了使其也从每个子模块导入命名属性,需要多几行代码。这是软件包
__init__.py文件的修改版本(在Python
3.4.1中也可以使用):
def _import_package_files(): """ Dynamically import all the public attributes of the python modules in this file's directory (the package directory) and return a list of their names. """ import os exports = [] globals_, locals_ = globals(), locals() package_path = os.path.dirname(__file__) package_name = os.path.basename(package_path) for filename in os.listdir(package_path): modulename, ext = os.path.splitext(filename) if modulename[0] != '_' and ext in ('.py', '.pyw'): subpackage = '{}.{}'.format(package_name, modulename) # pkg relative module = __import__(subpackage, globals_, locals_, [modulename]) modict = module.__dict__ names = (modict['__all__'] if '__all__' in modict else [name for name in modict if name[0] != '_']) # all public exports.extend(names) globals_.update((name, modict[name]) for name in names) return exportsif __name__ != '__main__': __all__ = ['__all__'] + _import_package_files() # '__all__' in __all__或者,您可以将以上内容放入包目录中单独的.py模块文件中(例如),
_import_package_files.py并从包中使用它,
__init__.py如下所示:
if __name__ != '__main__': from ._import_package_files import * # defines __all__ __all__.remove('__all__') # prevent export (optional)无论您以什么名字命名文件,它都应该以
_下划线字符开头,这样它就不会
import递归地尝试自身。



