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>