wake-up-neo.net

Python-Modul innerhalb des Codes installieren

Ich muss ein Paket von PyPi direkt in meinem Skript installieren. __ Vielleicht gibt es ein Modul oder eine distutils-Funktion (distribute, pip usw.), mit der ich etwas wie pypi.install('requests') ausführen kann, und Anforderungen werden in meine Virtualenv installiert.

194
chuwy

Sie können auch etwas verwenden wie:

import pip

def install(package):
    if hasattr(pip, 'main'):
        pip.main(['install', package])
    else:
        pip._internal.main(['install', package])

# Example
if __== '__main__':
    install('argh')
319
Rikard Anglerud

Die Lösung von Rickard wird vom Pip-Entwicklungsteam nicht unterstützt und stürzt in einigen Fällen ab (z. B. Multithreading). Außerdem wurde der Code seit Pip 10 nach pip._internal verschoben, um klarzustellen, dass dies nicht unterstützt wird. Diese Lösung schlägt daher mit einem Importfehler bei "pip> = 10.0.0" fehl.

Die Lösung von Quantum ist der bevorzugte Weg, um das Problem zu lösen, aber seine Implementierung garantiert nicht, dass der richtige Pip aufgerufen wird.

Diese Lösung garantiert, dass der Python-Interpreter, der den Code ausführt, aufgerufen wird.

import subprocess
import sys

def install(package):
    subprocess.call([sys.executable, "-m", "pip", "install", package])

Es funktioniert genauso wie die Lösung von Quantum. Statt pip direkt auszuführen, führt es dieselbe Python-Programmdatei aus, die den Code ausführt, und fordert das Pip-Modul auf, das installierte Pip-Modul auszuführen, und übergibt die restlichen Argumente an es.

68
Aaron de Windt

Wenn Sie pip verwenden möchten, um das erforderliche Paket zu installieren und nach der Installation zu importieren, können Sie diesen Code verwenden:

def install_and_import(package):
    import importlib
    try:
        importlib.import_module(package)
    except ImportError:
        import pip
        pip.main(['install', package])
    finally:
        globals()[package] = importlib.import_module(package)


install_and_import('transliterate')

Wenn Sie ein Paket als Benutzer installiert haben, besteht das Problem, dass Sie das Paket nicht einfach importieren können. Siehe So aktualisieren Sie sys.path für weitere Informationen.

66
rominf

Das sollte funktionieren:

import subprocess

def install(name):
    subprocess.call(['pip', 'install', name])
13
quantum

Sie definieren das abhängige Modul innerhalb der setup.py Ihres eigenen Pakets mit der Option "install_requires". 

Wenn für Ihr Paket ein Konsolenskript generiert werden muss, können Sie den Einstiegspunkt "console_scripts" verwenden, um ein Wrapper-Skript zu generieren, das Im "bin" -Ordner (z. B. Ihrer virtualenv-Umgebung) platziert wird.

7
Andreas Jung

Dies ist, wie ich installieren Sie alle Pakete für meine Projekte.

Einfach alle Namen zur Liste hinzufügen und ausführen eins, bevor der Hauptcode ausgeführt wird.

Dies mit der Verwendung von "venv" zu kombinieren ist großartig!

"""call this module to setup your python packages via pip"""

from pip._internal import main as pip

pip_install_argument = "install"

# packages to install
packages_to_install = [
        "numpy",        # math magic 1
        "scipy",        # math magic 2
        ]

def install(packages):
    """installes given packages via pip

    Args:
        package names as list

    Returns:
        None

    """
    global pip_install_argument
    for package in packages:
        pip([pip_install_argument, package])

if __== '__main__':
    install(packages_to_install)
3
Felix Quehl

Ich hoffe, diese Frage ist immer noch gültig ... Ich habe das oben genannte so etwas gemacht:

    import sys
    import os
    import site 

    try:
       import pip
    except ImportError:
       print "installing pip"
       cmd = "Sudo easy_install pip"
       os.system(cmd)
       reload(site)

    try: 
       import requests
    except ImportError:
       print "no lib requests"
       import pip
       cmd = "Sudo pip install requests"
       print "Requests package is missing\nPlease enter root password to install required package"
       os.system(cmd)
       reload(site)

der zweite try-Block kann auch in den else-Teil des ersten try-Blocks geschrieben werden. In meiner Problemstellung muss ich jedoch zwei separate Blöcke schreiben.

3
Umesh Kaushik

Ich gehe davon aus, dass wir einen Pip auf unserer Maschine haben, und werde versuchen, eine bestimmte Abhängigkeit zu finden, die fehlt. Versuchen Sie diese Methode und lassen Sie mich wissen, was Sie denken.

import os
try: 
    import something
    .....
    .....
except ImportError as e:
    pip = lambda : os.system('pip install' + str(e)[15:])
    pip()

Wenn Sie die pip-Funktionen verwenden, um den "selbstbewussten" Importer-Mechanismus anzuwenden, denken Sie auch daran, mit dem Modul lambda selbst zu arbeiten. Folgen Sie einfach diesem Code-Ausschnitt :)

try:
    import somthing
    ..........
    ..........
except ImportError as e:
    # importing pip module to handle pip functionalites
    import pip
    # create a lambda that import using pip by module_error_name=e[15:]
    installer = lambda : pip.main(['install', str(e)[15:])
    # create a lambda that import a module by linear_lambda_call
    importer = lambda x : __import__(str(x)).import_module()
    # install the module
    installer()
    # import the module
    importer()
1
SysMurff

Für mich funktioniert dies (Python 2.x), vorausgesetzt, alle Anforderungen sind in requirements.txt definiert:

def pip_auto_install():
    """
    Automatically installs all requirements if pip is installed.
    """
    try:
        from pip._internal import main as pip_main
        pip_main(['install', '-r', 'requirements.txt'])
    except ImportError:
        print("Failed to import pip. Please ensure that pip is installed.")
        print("For further instructions see "
              "https://pip.pypa.io/en/stable/installing/")
        sys.exit(-1)
    except Exception as err:
        print("Failed to install pip requirements: " + err.message)
        sys.exit(-1)


pip_auto_install()
1
siom

Ich verwende den os.system, um ein OS-Terminal zu emulieren, das ein Modul importiert, da Sie das Modul dann in allen anderen Skripten verwenden können.

Ich erstelle beispielsweise eine Game Engine, die auf separaten Skripten ausgeführt wird, die zusammengefügt wurden. Die meisten dieser Skripten verwenden Pygame. Wenn der Benutzer kein Pygame hat, wird es in der Startdatei mit folgendem Code hinzugefügt:

import os
os.system('pip install pygame')

Leider habe ich keine Ahnung, wie ich Pip auf den Computer des Benutzers bekommen soll. Dies hängt also davon ab, ob der Benutzer Pip hat.

0
X0FloH

1

> Download
> https://github.com/GeoNode/geonode-win-installer/blob/master/python_deps/pip-9.0.1-py2.py3-none-any.whl

2nd

extract .whl file and;  use winRar
copy extracted file and paste sitepackage [or python module container]

files are.. pip and pip-19.0.3.dist-info

3rd

import pip
pip.main(['install','scpy'])

scpy or any package you want to install
0
Eyasu

Sie können mit sys module einen Brunnen installieren

import sys
!{sys.executable} -m pip install <package> --user
0

Da das importierbare Pip-Modul nicht immer funktioniert, gibt es eine robustere Methode:

def PackageInstall(error):
    '''
    Finds out which package is missing and downloads it automatically after five seconds.

    Use example:

    try:
        import numpy as np
        import matplotlib.pyplot as plot

    except ImportError as error:
        PackageInstall(error)

    '''
    import time, subprocess, os, sys
    lib = str(error)[15:].replace('\'', '')
    print('>>>',str(error))
    print('>>> Download will start after five seconds')
    time.sleep(5)
    subprocess.call("pip install " + lib)

    print('>>> Restarting')
    os.startfile(__file__)
    sys.exit()

Das funktioniert bei Windows.

0
Ville