我知道我迟到了,但我想我找到了解决这个问题的办法。希望这对从事大型Python项目的其他人有用。
诀窍是尝试一种导入格式,如果第一种格式失败,则返回到另一种格式。
方法1
db.pytry:
# Assume we're a sub-module in a package.
from . import models
except ImportError:
# Apparently no higher-level package has been imported, fall back to a local import.
import models
另一方面,这种方法非常简单,但伸缩性不好(模块名重复)。可以通过编程方式导入来改进缩放。
方法2(不推荐)
db.pyimport importlib
root = 'project.modules.core'
my_modules = ['core', 'models']
for m in my_modules
try:
globals()[m] = importlib.import_module(root + '.' + m)
except ImportError:
globals()[m] = importlib.import_module(m)
当然,现在这个功能需要在每个模块中复制。我不确定这是否真的比第一种方法有所改进。但是,您可以将此逻辑分离到它自己的独立包中,该包位于pythonpath上的某个位置。
方法3
包装进口商.pyimport importlib
def import_module(global_vars, root, modules):
for m in modules
try:
global_vars[m] = importlib.import_module(root + '.' + m)
except ImportError:
global_vars[m] = importlib.import_module(m)
db.pyimport package_importer
root = 'project.modules.core'
my_modules = ['core', 'models']
package_importer.import_module(globals(), root, my_modules)