我想写一个脚本来自动设置一个全新的ubuntu安装和安装一个基于django的应用程序,因为这个脚本将在一个新的服务器上运行,Python脚本需要自动安装一些必需的模块。
这是剧本。
#!/usr/bin/env python
import subprocess
import os
import sys
def pip_install(mod):
print subprocess.check_output("pip install %s" % mod, shell=True)
if __name__ == "__main__":
if os.getuid() != 0:
print "Sorry, you need to run the script as root."
sys.exit()
try:
import pexpect
except:
pip_install('pexpect')
import pexpect
# More code here...
pexpect
的安装是成功的,但是下一行import pexpect
失败了,我认为这是因为在运行时代码没有意识到新安装的pexpect
。
如何在运行时安装和导入Python模块?我对其他方法持开放态度。
5条答案
按热度按时间nx7onnlm1#
您可以导入pip而不使用子进程:
另一个镜头:
[编辑]
您应该考虑使用requirements.txt和pip。看起来您正在尝试自动化部署(这很好!),在我的工具带中,我也有virtualenvwrapper,vagrant和ansible。
这是我的输出:
tag5nh1u2#
对于使用pip版本高于10.x的用户,
pip
没有main
函数,因此替代方法是使用import pip._internal as pip
而不是import pip
,如下所示:更新Paulo的回答
nc1teljy3#
我实际上为此目的制作了一个模块(impstall)
它真的很容易用途:
Github link for issues/contributions
gkn4icbw4#
我使用
imp
模块解决了我的问题。实际上,代码并不理想,因为我需要硬编码Python模块目录,但由于脚本是针对已知的目标系统,我认为这是可以的。
ztigrdn85#
我也遇到了同样的问题,但是谷歌搜索都没有帮助。经过几个小时的调试,我发现这可能是因为
sys.path
没有重新加载新的安装目录。在我使用Ubuntu Docker的情况下,我希望在运行时为Python3.8(预安装)使用
import dns.resolver
,我还创建了ubuntu
用户,并使用此用户运行所有内容(包括Python脚本)。sys.path
没有/home/ubuntu/.local/lib/python3.8/site-packages
,因为我没有安装任何东西。subprocess
或pip.main
安装时,它会创建/home/ubuntu/.local/lib/python3.8/site-packages
(作为用户安装)。sys.path
以包含此新位置。由于
sys.path
由site
模块管理,因此应重新加载它(参考HERE):所有需要的人都可以使用完整的模块:
我不是Python开发人员,所以这些代码可以简化得更多。这可能会对像我这样的DevOps工程师在新的CI/CD环境中有所帮助。