【发布时间】:2020-07-29 13:55:39
【问题描述】:
我使用的 api -- smartsheet-python-sdk 从源代码执行时运行良好。但是,当我使用 PyInstaller 进行打包时,我收到了一个错误,因为 PyInstaller 找不到必要的模块。在 smartsheet 库中,它使用 importlib.import_module 从库中导入模块。
def __getattr__(self, name):
"""
Handle sub-class instantiation.
Args:
name (str): Name of smartsheet to instantiate.
Returns:
Instance of named class.
"""
try:
# api class first
class_ = getattr(importlib.import_module(
__package__ + '.' + name.lower()), name)
return class_(self)
except ImportError:
# model class next:
try:
class_ = getattr(importlib.import_module(
name.lower()), name)
return class_()
except ImportError:
self._log.error(
'ImportError! Could not load api or model class %s', name)
return name
当它只从自己的库中导入模块而不是仅仅将导入语句添加到已知模块时,使用这样的东西有什么客观好处吗?
【问题讨论】:
-
如果您在变量中有模块名称,例如
module_name = 'sys',您不能使用 import 语句导入它,但您可以这样做importlib.import_module(module_name) -
但是它只是导入自己的模块,为什么它需要是一个字符串而不是仅仅导入静态模块。
smartsheet.sheets将使用 pyinstaller 抛出错误,因为sheets永远不会被拾取。 -
@Software2 不是真的,我知道它允许动态导入,我只是不明白这种特殊情况需要这样做的原因,因为它只会引用它自己的模块。除非我完全遗漏了某些东西(当然不是不可能的),否则似乎只导入它们就不太容易出错。所以基本上除了能够动态导入之外还有一个优势。
标签: python import smartsheet-api