我正在编写一个自动设置django Web服务器环境的python脚本。
在脚本中,我正在使用
安装新模块for package in packages:
os.system("%s %s" % ('easy_install', package))
这很好用。我唯一的问题是我想使用
在同一个脚本中使用这些新安装的软件包package = __import__(package)
这不起作用,我收到一个ImportError:没有名为reportlab的模块(例如)
如果我再次运行脚本,脚本就会起作用,因为我假设所有新安装的软件包都在系统路径上。我希望有一种方法可以在不重新启动脚本的情况下导入新模块。
我尝试了重载(sys),但它没有帮助我。我可以通过手动附加到sys.path或使用os.system()启动一个新的python脚本来破解它,但我更喜欢更清洁的解决方案。
答案 0 :(得分:3)
没有更清洁的解决方案。您正在安装程序包,这会导致系统路径的更新。您必须修改路径或启动在新环境中工作的子脚本。
另外。不要使用os.system
。请使用subprocess
。
执行此操作的风险最小的方法是使用“主”脚本,只执行两种操作。
使用subprocess.Popen
运行easy_install脚本序列。
在所有easy_install脚本之后使用subprocess.Popen
完成剩下的工作。由于这是一个单独的过程,因此它可以构建一个单独的Python PATH,其中包含所有新包。
答案 1 :(得分:0)
看看Fabric,看看它会让你的生活变得更轻松。 Django integration在这里。
答案 2 :(得分:0)
您需要重新加载site
模块,而不是sys
:
"Importing this module will append site-specific paths to the module search path and add a few builtins."
另外,请考虑使用importlib.import_module
代替__import__
:
This is an advanced function that is not needed in everyday Python programming, unlike importlib.import_module().