在python脚本中加载新安装的模块



我正在编写一个python脚本,它可以自动设置django web服务器环境。

在脚本中,我正在使用安装一个新模块

for package in packages:
    os.system("%s %s" % ('easy_install', package))

这很好用。我唯一的问题是,我想在使用的同一脚本中使用这些新安装的软件包

package = __import__(package)

但这不起作用,我收到了一个ImportError:No module named reportlab(例如)

如果我再次运行该脚本,那么该脚本的工作方式就像我假设所有新安装的包都在系统路径上一样。我希望有一种方法可以在不重新启动脚本的情况下导入新模块。

我试着重新加载(sys),但它对我没有帮助。我可以通过手动附加到sys.path或使用os.system()启动一个新的python脚本来破解它,但我更喜欢一个更干净的解决方案。

不可能有更清洁的解决方案。您正在安装一个程序包,该程序包将更新系统路径。您必须修改路径,或者启动一个在新环境中工作的子脚本。

此外。不要使用os.system。请使用subprocess

做到这一点风险最小的方法是有一个只做两种事情的"大师"脚本。

  1. 使用subprocess.Popen运行easy_install脚本序列。

  2. 在完成所有easy_install脚本后,使用subprocess.Popen完成其余工作。由于这是一个独立的过程,它可以构建一个单独的Python PATH,其中包含所有新的包

看看Fabric,从外观上看,它会让你的生活轻松很多。Django集成在这里。

您需要重新加载site模块,而不是sys:"导入此模块将在模块搜索路径中添加特定站点的路径,并添加一些内置内容。"

此外,请考虑使用importlib.import_module而不是__import__:这是一个在日常Python编程中不需要的高级函数,与importlib.import_module()不同。

最新更新