9
votes

Comment installer et importer des modules Python au moment de l'exécution?

Je souhaite écrire un script pour configurer automatiquement une nouvelle installation Ubuntu et installer une application Django. Étant donné que le script sera exécuté sur un nouveau serveur, le script Python doit installer automatiquement certains modules requis.

Voici le script. xxx

L'installation de PEXPECT est le succès, mais la ligne suivante import PEXPECT est échouée. Je pense que c'est parce qu'au moment de l'exécution, le code ne conscient pas du nouvellement installé peexpect .

Comment installer et importer des modules Python au moment de l'exécution? Je suis ouvert à une autre approche.


1 commentaires

non testé: peexpect = __import __ ("PEXPECT")


5 Réponses :


9
votes

Vous pouvez importer PIP au lieu d'utiliser Subprocess:

(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#


2 commentaires

Le problème persiste: l'installation est le succès, mais l'importation génère importerror: aucun module nommé PEXPECT .


Non, j'écris et exécutez le script sur une nouvelle installation Ubuntu. Il n'a que python-pip installé.



2
votes

J'ai résolu mon problème en utilisant IMP code> Module.

#!/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...


0 commentaires

3
votes

i fait réellement un module pour ce but exact ( Impstall )

C'est vraiment Facile à utiliser: P>

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


0 commentaires

4
votes

Pour ceux qui utilisent la version PIP supérieure à 10.x, il n'y a pas de fonction principale code> pour pip code> de sorte que l'approche alternative utilise Importer pip._internal en tant que pip code> au lieu de Importer pip code> comme:

réponse mise à jour de Paulo H1>
import pip._internal as pip

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

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


0 commentaires

0
votes

J'ai eu le même problème, mais aucune des recherches de Google n'a aidé. Après le débogage des heures, j'ai trouvé que c'était parce que le sys.path code> n'est pas rechargé avec un nouveau répertoire d'installation.

Dans mon cas sur mon Ubuntu Docker, je veux Importer DNS. Résolveur code> au moment de l'exécution pour Python3.8 (préinstallé). J'ai aussi créé ubuntu code> utilisateur et exécutez toutes les choses avec cet utilisateur (y compris mon script Python). P>

  • Avant d'installer, sys.path code> n'a pas /home/python/.local/lib/python3.8/site-packages code> car je n'ai pas installé n'importe quoi. li>
  • en installant avec sous-processus code> ou pip.main code> comme ci-dessus, il crée /home/ubuntu/.local/lib/python3.8/site-packages code> (comme installation de l'utilisateur). li>
  • Après l'installation, le sys.path code> doit être actualisé pour inclure ce nouvel emplacement. LI> ul>

    depuis le sys.path code> est géré par le module code> du site code>, nous devrions le recharger (ref ICI ): P>

    import subprocess
    import sys
    
    try:
        import dns.resolver
    except ImportError:
        subprocess.check_call([sys.executable, "-m", "pip", "install", "dnspython"])
        import site
        from importlib import reload
        reload(site)
        import dns.resolver
    


0 commentaires