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)来管理包。
我一直在为 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)来管理包。