[Petite histoire] Une mesure minutieuse lorsque vous devez exécuter une fonction avant l'importation en Python

C'est une petite histoire. C'est un cas rare, mais c'est une mesure lorsque Python nécessite l'exécution d'une fonction ou d'une méthode avant l'importation.

Contexte

Lorsque j'ai installé matplotlib sur Linux et que je l'ai utilisé sur du code Python, j'ai eu l'erreur suivante.

_tkinter.TclError: no display name and no $DISPLAY environment variable

La solution à cette erreur apparaît dès que je recherche, et la réponse semble être que le backend de matplotlib devrait être Agg. (Les détails sur les erreurs et les backends sont omis cette fois)

Il semble y avoir plusieurs façons de faire cela, et la méthode d'écriture de backend: Agg dans / etc / matplotlibrc [^ 1] et la méthode d'utilisation de matplotlib.use ('Agg') [^ 2] sont les principales recherches. C'était à la hauteur.

Cette fois, supposons que nous utiliserons matplotlib.use ('Agg').

problème

import matplotlib
matplotlib.use('Agg')
from matplotlib import pyplot


def plot(data):
    pyplot.plot(data)

Si vous appelez matplotlibu.use ('Agg') après l'importation comme ci-dessus, cela fonctionne, mais il y a un problème avec cela, et un outil qui change automatiquement l'ordre d'importation ([isort](https: //) pypi.python.org/pypi/isort) etc.) sera réécrit comme suit.

import matplotlib
from matplotlib import pyplot

matplotlib.use('Agg')


def plot(data):
    pyplot.plot(data)

Il semble que matplotlib.use ('Agg') doit être appelé avant d'écrire from matplotlib import pyplot, ce qui pose un problème lorsque CI vérifie automatiquement le code. Il existe un moyen de l'importer dans la fonction appelante au moment de l'exécution, mais cela devient plus compliqué à mesure que le nombre d'importations et le nombre de fonctions augmentent.

Contre-mesures

En guise de contre-mesure, elle peut être mise en œuvre comme suit.

try:
    import matplotlib
    matplotlib.use('Agg')
finally:
    from matplotlib import pyplot


def plot(data):
    pyplot.plot(data)

Pour le moment, cela peut garantir la commande.

[^ 1]: Comment éviter la récurrence du problème de mousse de matplotlib avec $ DISPLAY non défini

[^ 2]: Dessinez un graphe avec matplotlib.

Recommended Posts

[Petite histoire] Une mesure minutieuse lorsque vous devez exécuter une fonction avant l'importation en Python
Comment importer des fichiers où vous le souhaitez en Python
[Sous-processus] Lorsque vous souhaitez exécuter un autre programme Python en code Python
Précautions lors du décapage d'une fonction en python
[Python] Choses à vérifier lorsqu'une erreur de décodage Unicode apparaît dans Django
Choses à noter lors de l'initialisation d'une liste en Python
python Spécifie la fonction à exécuter lorsque le programme se termine
Lorsque vous voulez plt.save dans l'instruction for
Comment exécuter une commande à l'aide d'un sous-processus en Python
Comprendre le rendement Python Si vous mettez le rendement dans une fonction, elle se transforme en générateur
[Django] Mémorandum lorsque vous souhaitez communiquer de manière asynchrone [Python3]
[C / C ++] Passez la valeur calculée en C / C ++ à une fonction python pour exécuter le processus et utilisez cette valeur en C / C ++.
Créer une fonction en Python
Une histoire sur la façon de spécifier un chemin relatif en python.
Pour renvoyer char * dans une fonction de rappel à l'aide de ctypes en Python
Pour savoir dans quel bac une valeur donnée entre lorsque vous avez un délimiteur de bac dans ndarray
[Python] Lorsque vous souhaitez importer et utiliser votre propre package dans le répertoire supérieur
Une histoire sur la tentative d'implémentation de variables privées en Python.
Lorsque vous souhaitez lancer une commande UNIX sur Python
Une histoire à laquelle j'étais accro en spécifiant nil comme argument de fonction dans Go
Écrivez un script dans Shell et Python pour vous avertir dans Slack lorsque le processus est terminé
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
Lorsque vous souhaitez remplacer plusieurs caractères dans une chaîne de caractères sans utiliser d'expressions régulières dans la série python3
Que faire si vous obtenez moins zéro en Python
[Python] Temps d'exécution lorsqu'une fonction est saisie dans une valeur de dictionnaire
Spécification du fuseau horaire lors de la conversion d'une chaîne de caractères en type datetime avec python
[Python] Lorsque vous souhaitez utiliser toutes les variables dans un autre fichier
J'ai écrit une fonction pour charger le script d'extension Git en Python
Si vous souhaitez affecter une exportation csv à une variable en python
[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
Vérifiez si vous pouvez vous connecter à un port TCP en Python
Précautions lors de l'attribution de valeurs par défaut aux arguments dans les définitions de fonctions Python
Mesurer le temps d'exécution de la fonction en Python
Lors de l'écriture d'un programme en Python
[Petite histoire] Comment enregistrer des graphiques matplotlib dans un lot avec Jupyter
Remarque: [Python3] Convertissez datetime en chaîne dans le format de votre choix
Comment mettre un espace demi-largeur avant les lettres et les chiffres en Python.
Quand impossible d'attribuer le module avant que l'appel Module.init () ne soit émis dans pytorch
Comment écrire une chaîne de caractères lorsqu'il y a plusieurs lignes en python
Que se passe-t-il si vous "importez A, B comme C" en Python?
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
Comment obtenir stacktrace en python
Une histoire déroutante avec deux façons d'implémenter XGBoost en Python + notes générales
Créez un plugin qui vous permet de rechercher les onglets Sublime Text 3 en Python
Que faire lorsqu'un avertissement apparaît autour de l'intégration de Python dans CheckHealth de Neovim
La synchronisation de la sortie est incorrecte lorsque la sortie standard (erreur) est convertie en fichier en Python
Une histoire à laquelle j'étais accro après la communication SFTP avec python
Je n'ai pas eu besoin d'écrire décorateur en classe Merci contextmanager
Un mémo de fonction utile lorsque vous souhaitez entrer dans le débogueur si une erreur se produit lorsque vous exécutez un script Python.
Dessiner un graphique d'une fonction quadratique en Python
Calculons en fait le problème statistique avec Python
Enregistrer automatiquement les arguments de fonction dans argparse en Python
Comment effacer un taple dans une liste (Python)