如何在运行时安装和导入Python模块?

我想写一个脚本来自动设置一个全新的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模块? 我打开另一种方法。

Solutions Collecting From Web of "如何在运行时安装和导入Python模块?"

您可以导入pip而不是使用子流程:

 import pip def install(package): pip.main(['install', package]) # Example if __name__ == '__main__': try: import pexpect except ImportError: install('pexpect') import pexpect 

另取:

 import pip def import_with_auto_install(package): try: return __import__(package) except ImportError: pip.main(['install', package]) return __import__(package) # Example if __name__ == '__main__': pexpect = import_with_auto_install('pexpect') print(pexpect) 

[编辑]

您应该考虑与pip一起使用requirements.txt 。 好像你正在尝试自动化部署(这很好!),在我的工具带我也virtualenvwrapper, 流浪和ansible 。

这是我的输出:

 (test)root@vagrant:~/test# pip uninstall pexpect Uninstalling pexpect: /usr/lib/python-environments/test/lib/python2.6/site-packages/ANSI.py /usr/lib/python-environments/test/lib/python2.6/site-packages/ANSI.pyc /usr/lib/python-environments/test/lib/python2.6/site-packages/FSM.py /usr/lib/python-environments/test/lib/python2.6/site-packages/FSM.pyc /usr/lib/python-environments/test/lib/python2.6/site-packages/fdpexpect.py /usr/lib/python-environments/test/lib/python2.6/site-packages/fdpexpect.pyc /usr/lib/python-environments/test/lib/python2.6/site-packages/pexpect-2.4-py2.6.egg-info /usr/lib/python-environments/test/lib/python2.6/site-packages/pexpect.py /usr/lib/python-environments/test/lib/python2.6/site-packages/pexpect.pyc /usr/lib/python-environments/test/lib/python2.6/site-packages/pxssh.py /usr/lib/python-environments/test/lib/python2.6/site-packages/pxssh.pyc /usr/lib/python-environments/test/lib/python2.6/site-packages/screen.py /usr/lib/python-environments/test/lib/python2.6/site-packages/screen.pyc Proceed (y/n)? y Successfully uninstalled pexpect (test)root@vagrant:~/test# python test.py Downloading/unpacking pexpect Downloading pexpect-2.4.tar.gz (113Kb): 113Kb downloaded Running setup.py egg_info for package pexpect Installing collected packages: pexpect Running setup.py install for pexpect Successfully installed pexpect Cleaning up... <module 'pexpect' from '/usr/lib/python-environments/test/lib/python2.6/site-packages/pexpect.pyc'> (test)root@vagrant:~/test# 

我用imp模块解决了我的问题。

 #!/usr/bin/env python import pip import imp def install_and_load(package): pip.main(['install', package]) path = '/usr/local/lib/python2.7/dist-packages' if path not in sys.path: sys.path.append(path) f, fname, desc = imp.find_module(package) return imp.load(package, f, fname, desc) if __name__ == "__main__": try: import pexpect except: pexpect = install_and_load('pexpect') # More code... 

其实代码是不太理想的,因为我需要硬编码的Python模块目录。 但是因为脚本是用于一个已知的目标系统,所以我认为这是可以的。

我实际上为了这个确切目的而制作了一个模块( impstall )

这非常容易使用:

 import impstall impstall.now('pexpect') impstall.now('wx', pipName='wxPython') 

Github链接的问题/贡献