Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在运行时安装和导入Python模块?_Python_Linux_Subprocess - Fatal编程技术网

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

如何在运行时安装和导入Python模块?,python,linux,subprocess,Python,Linux,Subprocess,我想写一个脚本来自动安装一个全新的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 __n

我想写一个脚本来自动安装一个全新的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模块?我对其他方法持开放态度。

您可以导入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和PIP。似乎您正在尝试自动化部署(这很好!),在我的工具带中,我还有VirtualVWrapper和

这是我的输出:

(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#
(测试)root@vagrant:~/test#pip卸载pexpect
正在卸载pexpect:
/usr/lib/python环境/test/lib/python2.6/site-packages/ANSI.py
/usr/lib/python环境/test/lib/python2.6/site-packages/ANSI.pyc
/usr/lib/python环境/test/lib/python2.6/site-packages/FSM.py
/usr/lib/python环境/test/lib/python2.6/site-packages/FSM.pyc
/usr/lib/python环境/test/lib/python2.6/site-packages/fdpexpect.py
/usr/lib/python环境/test/lib/python2.6/site-packages/fdpexpect.pyc
/usr/lib/python环境/test/lib/python2.6/site-packages/pexpect-2.4-py2.6.egg-info
/usr/lib/python环境/test/lib/python2.6/site-packages/pexpect.py
/usr/lib/python环境/test/lib/python2.6/site-packages/pexpect.pyc
/usr/lib/python环境/test/lib/python2.6/site-packages/pxsh.py
/usr/lib/python环境/test/lib/python2.6/site-packages/pxsh.pyc
/usr/lib/python环境/test/lib/python2.6/site-packages/screen.py
/usr/lib/python环境/test/lib/python2.6/site-packages/screen.pyc
是否继续?Y
已成功卸载pexpect
(测试)root@vagrant:~/test#python test.py
下载/解包pexpect
下载pexpect-2.4.tar.gz(113Kb):下载113Kb
正在运行程序包pexpect的setup.py egg\u信息
安装收集的软件包:pexpect
正在为pexpect运行setup.py安装
已成功安装pexpect
清理。。。
(测试)root@vagrant:~/测试#

我使用该模块解决了我的问题


实际上,代码并不理想,因为我需要对Python模块目录进行硬编码。但是,由于脚本是为已知的目标系统设计的,我认为这是可以的。

我实际上为此制作了一个模块()

它非常容易使用:

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

对于那些使用大于10.x的pip版本的用户,对于
pip
没有
main
功能,因此替代方法是使用
import pip.\u internal as pip
而不是
import pip
,如:

最新答覆
未测试:
pexpect=\uuuuu导入(“pexpect”)
问题仍然存在:安装成功,但导入生成了
ImportError:没有名为pexpect的模块。不,我在新的ubuntu安装上编写并运行脚本。它只安装了
pythonpip
包。
import impstall
impstall.now('pexpect')
impstall.now('wx', pipName='wxPython')
import pip._internal as pip

def install(package):
    pip.main(['install', package])

if __name__ == '__main__':
    try:
        import pexpect
    except ImportError:
        install('pexpect')
        import pexpect