ImportError 依赖项安装导致 NameError

ImportError dependency install resulting in NameError

我一直在为 bootstrap 我的环境编写一个小脚本,但在尝试处理模块导入错误时遇到了一些混乱。我的目的是捕获 yaml 模块的任何导入错误,然后使用 apt 安装模块,然后重新导入它...

def install_yaml():
    print "Attempting to install python-yaml"
    print "=============== Begining of Apt Output ==============="
    if subprocess.call(["apt-get", "-y", "install", "python-yaml"]) != 0 :
        print "Failure whilst installing python-yaml"
        sys.exit(1)
    print "================= End of Apt Output =================="
    #if all has gone to plan attempt to import yaml
    import yaml
    reload(yaml)

try:
    import yaml
except ImportError:
    print "Failure whilst importing yaml"
    install_yaml()

grains_config = {}
grains_config['bootstrap version'] = __version__
grains_config['bootstrap time'] = "{0}".format(datetime.datetime.now())

with open("/tmp/doc.yaml", 'w+') as grains_file:
    yaml.dump(grains_config, grains_file, default_flow_style=False)

不幸的是,当我运行时出现 NameError

Traceback (most recent call last):
  File "importtest-fail.py", line 32, in <module>
    yaml.dump(grains_config, grains_file, default_flow_style=False)
NameError: name 'yaml' is not defined

经过一些研究,我发现了内置的 reload(重新加载以前导入的模块),这听起来像我想做的,但在第一次使用 yaml 模块时仍然会导致 NameError。

有没有人有任何建议可以让我处理导入异常、安装依赖项和 "re-import" 它?

我显然可以将 python 脚本包装在一些 bash 中以进行初始依赖项安装,但这不是一个非常干净的解决方案。

谢谢

您将 yaml 作为 local 导入 install_yaml()。您必须将其标记为全局:

global yaml

在函数内部,或者更好的是,将函数的导入 out 移到调用 install_yaml().

之后

就个人而言,我从不以这种方式自动安装依赖项。只是失败并留给管理员正确安装依赖项。例如,他们可能正在使用其他方式(例如 virtualenv)来管理包。