2013-06-21 101 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