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. P> L'installation de Comment installer et importer des modules Python au moment de l'exécution? Je suis ouvert à une autre approche. P> p> PEXPECT code> est le succès, mais la ligne suivante import PEXPECT code> 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 code>. P>
5 Réponses :
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#
Le problème persiste: l'installation est le succès, mais l'importation génère importerror: aucun module nommé PEXPECT code>.
Non, j'écris et exécutez le script sur une nouvelle installation Ubuntu. Il n'a que python-pip code> installé.
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...
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')
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
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 Dans mon cas sur mon Ubuntu Docker, je veux depuis le sys.path code> n'est pas rechargé avec un nouveau répertoire d'installation. 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>
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>
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>
sys.path code> doit être actualisé pour inclure ce nouvel emplacement. LI>
ul> 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
non testé:
peexpect = __import __ ("PEXPECT") CODE>