如何将Python代码构建到模块/包中?

时间:2009-04-20 22:10:09

标签: python module package

假设我有这种准系统结构:

project/
  main.py
  providers/
    __init.py__
    acme1.py
    acme2.py
    acme3.py
    acme4.py
    acme5.py
    acme6.py

假设main.py包含(部分):

if complexcondition():
  print providers.acme5.get()

__init__.py为空,acme*.py包含(部分):

def get():
  value=complexcalculation()
  return value

如何更改这些文件?

注意:如果答案是“import acme1”,“import acme2”等等__init__.py,那么有没有办法实现这一点而不用手动列出所有内容?

3 个答案:

答案 0 :(得分:6)

哎!两年后但......可能对某人有所帮助

providers / __ init __。py 设为:

import os
import glob

module_path = os.path.dirname(__file__)
files = glob.glob(os.path.join(module_path, 'acme*.py'))
__all__ = [os.path.basename(f)[:-3] for f in files]

如果添加或删除任何提供商/ acme * .py

,您无需在以后更改

然后在 main.py

中使用from providers import *

答案 1 :(得分:5)

如果我正确地阅读了您的问题,看起来您似乎没有尝试进行任何动态导入(例如Van Gale提到的问题)但实际上只是尝试导入提供程序包中的所有模块。如果是这种情况,在__init__.py中你会想要这个陈述:

__all__ = ["acme1", "acme2", "acme3", "acme4", "acme5", "acme6"]

然后导入您将使用的所有内容... import *

from providers import *

然后代替在代码中显式使用包名称,您只需调用导入的类

acme1.get()
acme2.get()

如果提供程序包中有足够的模块,填充__all__列表就会出现问题,您可能需要考虑将它们分解为更小的包或以其他方式存储数据。我个人不希望每次想要重新使用包时都要处理动态导入schennagins。

答案 2 :(得分:3)

今天提出的这个问题,Dynamic Loading of Python Modules,应该有你的答案。