2013-06-21 105 views
4

我想写一个脚本来自动设置一个全新的ubuntu安装并安装一个基于django的应用程序。由于该脚本将在新服务器上运行,Python脚本需要自动安装一些必需的模块。如何在运行时安装和导入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模块?我接受另一种方法。

+1

未经测试:'Pexpect的= __import __( 'Pexpect的')' –

回答

2

我使用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模块目录进行硬编码。但既然脚本是用于一个已知的目标系统,我认为这是可以的。

5

您可以导入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) 

[编辑]

你应该考虑使用requirements.txt与PIP一起。好像你正在尝试自动化部署(这很好!),在我的工具带上我也有virtualenvwrapper,vagrantansible

这是输出对我来说:

(test)[email protected]:~/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)[email protected]:~/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)[email protected]:~/test# 
+0

问题仍然存在:安装成功,但导入生成'ImportError:no module named pexpect'。 – flowfree

+0

你在使用virtualenv吗? –

+0

不,我在新的ubuntu安装中编写并运行脚本。它只安装了'python-pip'软件包。 – flowfree