Mise à jour automatique du module Python

Préface

Si vous laissez le module Python tel qu'il a été livré, la livraison peut rester bloquée.

Cette fois, nous utiliserons un module appelé chromedriver-binary comme exemple. Le rôle de chromedriver-binary est de vous permettre de faire fonctionner le navigateur Chrome via Python. Le chromedriver-binary doit être installé pour le navigateur Chrome. Le navigateur Chrome se mettra à jour sans autorisation, vous n'avez donc rien à faire Finalement, chromedriver-binary ne sera plus pris en charge et les livraisons s'arrêteront. Vous pouvez utiliser la mise à jour automatique du module dans un tel endroit.

Appareil ①

Auparavant, je pouvais utiliser la méthode de détournement du code de \ _ \ _ init \ _ \ _. Py de pip. Il est devenu inutilisable après la nouvelle version de pip. Si vous regardez la console Pycharm etc., vous trouverez des conseils sur la nouvelle méthode.

Traduit "Veuillez exécuter la commande pip directement" Je pense que c'était une histoire comme ça.

Si vous pouvez facilement résumer le mécanisme Cela signifie que vous devez exécuter "pip install ***" autour du sous-processus. Il a été confirmé qu'il peut être utilisé de cette manière même si vous utilisez venv.

Lorsque ce qui précède est résumé dans une fonction, cela ressemble à ceci.

installer.py


import sys
import subprocess

    def install_module(module: str, ver: str = None):
        """
Installez le module spécifié (la version peut être spécifiée)
        :param module:Nom du module
        :param ver:Version du module
        :return:
        """
        #Ajouter des options si la version est spécifiée
        if ver is not None:
            ver = f"=={ver}"
        else:
            ver = ""

        #Effectuer les travaux d'installation
        try:
            command = f"pip install {module}{ver}"
            subprocess.call(command, shell=True)
        except Exception:
            sys.exit(-1)

Appareil ②

Mettez le code ci-dessus dans le programme et vous avez terminé! !! Ce n'est pas aussi simple que ... Puisque l'en-tête est "Mécanisme ①", il y a toujours ② et ③.

Utilisez-le comme suit.

sample_1.py


try:
  driver = webdriver.Chrome()
except:
  install_module("chromedriver-binary", "86.0.4240.22.0")

Il installera le module spécifié lorsqu'il s'écoulera sauf ... Le contenu de la variable de pilote n'est toujours pas défini.

sample_2.py


try:
  driver = webdriver.Chrome()
except:
  install_module("chromedriver-binary", "86.0.4240.22.0")
  driver = webdriver.Chrome()

Si c'est le cas, il ne semble y avoir aucun problème dans le code, mais ... driver = webdriver.Chrome () Ce code est Sur quel chromedriver-binary est-il basé? -Est-ce le chromedriver-binary au moment où l'importation chromedriver-binary est déclarée? -Est-ce un binaire chromedriver nouvellement installé? Cela dépend de la méthode de mise en œuvre, mais pour autant que je l'ai vérifié, cela semble fonctionner avec le premier.

Vous pouvez le recharger en utilisant importlib.reload (nom du module) etc. Il existe également un moyen de redémarrer le fichier py lui-même, La partie qui n'est pas liée à la ligne principale du programme devient gênante. Le redémarrage du fichier py mettra fin au processus du fichier py une fois. S'il y a quelque chose dans le système qui attend la fin du processus Il y a beaucoup de choses gênantes telles que le démarrage du processus suivant même si le processus du fichier py n'est pas terminé.

La chose la plus simple à laquelle j'ai pensé était de faire le lot suivant.

run.bat


Pour vérifier le module py.py
py pour le traitement principal.py

Si vous utilisez un fichier batch ① Si vous attendez la fin du traitement et passez à l'étape suivante, attendez la fin du fichier de commandes avant de passer à l'étape suivante. (2) Le processus principal peut être rationalisé en faisant la vérification du module et le processus principal des fichiers py séparés. ③ Lorsque vous exécutez l'installation avec .py pour vérifier le module Vous pouvez maintenir le module à jour lorsque vous exécutez le traitement principal .py

Appareil ③

Si vous pouvez vous exercer sur l'appareil ① et l'appareil ②, vous pouvez l'utiliser pour installer / mettre à jour le module. Malheureusement, il ne suffit toujours pas de l'utiliser pour mettre à jour le chromedriver-binary. D'après ce que j'ai vérifié vers 2018, chromedriver-binary ne fonctionne pas avec le dernier installé. Vous devez savoir quelle version vous souhaitez installer et la donner comme argument.

Comment trouver la version binaire chromedriver correspondante

Vous pouvez le voir en donnant la version principale du navigateur Chrome à l'URL de ↓ et en ouvrant l'URL https://chromedriver.storage.googleapis.com/LATEST_RELEASE_{chromeブラウザのメジャーバージョン} Exemple: https://chromedriver.storage.googleapis.com/LATEST_RELEASE_86

Alors, comment connaître la version du navigateur Chrome? C:\Program Files (x86)\Google\Chrome\Application Ou C:\Program Files\Google\Chrome\Application Si vous regardez, vous pouvez trouver le dossier avec le numéro de version. Vous pouvez obtenir le numéro de version en le coupant bien.

Cependant, étant donné que tout ce dont vous avez besoin est la version principale, il vous suffit de récupérer la version principale, ce qui convient aux opérations de chaîne. En résumé, ça ressemble à ça.

installer.py


import sys
import re
import requests
import subprocess


   def get_lastrelease_chromedriver():
        """
Obtenez la dernière version de chromedriver pour votre navigateur Chrome
        :return:
        """
        #Obtenez la version du navigateur Chrome installé
        try:
            res = subprocess.Popen('dir /B /O-N "C:\Program Files (x86)\Google\Chrome\Application" | findstr "^[0-9].*\>"', stdout=subprocess.PIPE, shell=True).communicate()
            target = str(res[0])
            pattern = r'[0-9]+\.'
            match = re.search(pattern, target)
            if match is None:
                # [Pour 32 bits]
		res = subprocess.Popen('dir /B /O-N "C:\Program Files\Google\Chrome\Application" | findstr "^[0-9].*\>"', stdout=subprocess.PIPE, shell=True).communicate()

            if len(res) < 1:
                raise Exception("échec de la commande de vérification de la version du navigateur chrome")
            target = str(res[0])
            pattern = r'[0-9]+\.'
            match = re.search(pattern, target)
            if match is None:
                sys.exit(-1)
            chrome_ver = match.group(0).replace('.', '')
        except:
            return None

        #Demandez au service WEB la version du pilote Chrome
        try:
            api = "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_{}"
            ver = requests.get(api.format(chrome_ver)).text
        except:
            return None

        return ver

Si vous l'incorporez dans le module de confirmation .py, cela ressemblera à ↓

Pour vérifier le module.py


try:
  driver = webdriver.Chrome()
except:
  ver = get_lastrelease_chromedriver()
  install_module("chromedriver-binary", ver)

Vous devriez maintenant pouvoir mettre à jour automatiquement le binaire chromedriver.

Recommended Posts

Mise à jour automatique du module Python
Mise à jour Python (2.6-> 2.7)
Collecte automatique des cours boursiers à l'aide de python
Importer le module Python
Passez le chemin du module python importé
Méthode de mise à jour automatique par python Pyinstaller exe
Créer un diagramme de relations des modules Python
Obstrué par la mise à jour Python de la console GCP ①
Les bases de Python ①
Bases de python ①
Vérifiez le chemin du module importé Python
Copie de python
Module de collections Python
Introduction de Python
Obstruction de la mise à jour python de la console GCP ② (Solution)
[Python] [chardet] Détection automatique du code de caractère dans les fichiers
[Hikari-Python] Module Chapitre 08-04 (Installation d'une bibliothèque externe)
Encodage de caractères lors de l'utilisation du module csv de python 2.7.3
[Python] Une compréhension approximative du module de journalisation
Essayez d'utiliser le module de collections (ChainMap) de python3
Au moment de la mise à jour de python avec ubuntu
[Python] Type de classe et utilisation du module datetime
Python / Clé basse automatique inadaptée aux données expérimentales
Obtenez la date de mise à jour du fichier de mémorandum Python.
[Python] Opération d'énumération
Module Python (mémo d'apprentissage Python ④)
mémorandum python (mise à jour séquentielle)
Créer un module Python
Unification de l'environnement Python
Copie des préférences python
Principes de base du grattage Python
importation du module d'origine python
[python] comportement d'argmax
Utilisation des locaux Python ()
le zen de Python
Installation de Python 3.3 rc1
# 4 [python] Bases des fonctions
Connaissance de base de Python
Anecdotes sobres de python3
Résumé des arguments Python
Bases de python: sortie
Installation de matplotlib (Python 3.3.2)
Application de Python 3 vars
Divers traitements de Python
[python] Récupère la liste des classes définies dans le module
Utilisons la version Python du module API Confluence.
L'histoire de la conversion automatique du langage de TypeScript / JavaScript / Python
Exemple d'obtention du nom du module et du nom de la classe en Python
Module [Python of Hikari-] Chapitre 08-03 (Importation et utilisation de la bibliothèque standard)
Trier les importations de modules Python par ordre alphabétique
Fonctionnement de l'importation de modules Python
Vers la retraite de Python2
résumé lié à l'opération de fichier python
Résumé des opérations de liste Python3
Python - Démarrage rapide de la journalisation
Recommandation de la bibliothèque binpacking de python
[Python] ModuleNotFoundError: aucun module nommé "urlparse"
Exécuter des tâches automatisées en Python
[python] Valeur de l'objet fonction (?)