Suite

Comment appeler l'outil par défaut dans QGIS à l'intérieur du plugin à l'aide d'un script python?

Comment appeler l'outil par défaut dans QGIS à l'intérieur du plugin à l'aide d'un script python?


Je veux créer un plugin qui peut dessiner des polygones irréguliers dans QGIS. Pour cela, je veux appeler le Sélectionnez les fonctionnalités à main levée outil par défaut dans mon plugin. Comment puis-je le faire dans un script python?


Cela devrait fonctionner :

iface.actionSelectFreehand().trigger()

Premiers pas avec Plotly en Python

Plotly est une bibliothèque graphique gratuite et open source pour Python. Nous vous recommandons de lire notre guide de démarrage pour les dernières instructions d'installation ou de mise à niveau, puis de passer à nos didacticiels Plotly Fundamentals ou de plonger directement dans certains didacticiels Basic Charts.

Présentation¶

La bibliothèque plotly Python est une bibliothèque de traçage interactive et open source qui prend en charge plus de 40 types de graphiques uniques couvrant un large éventail de cas d'utilisation statistiques, financiers, géographiques, scientifiques et tridimensionnels.

Construit sur la bibliothèque Plotly JavaScript (plotly.js), plotly permet aux utilisateurs de Python de créer de superbes visualisations Web interactives qui peuvent être affichées dans des blocs-notes Jupyter, enregistrées dans des fichiers HTML autonomes ou utilisées dans le cadre d'un site Web purement Python. applications utilisant Dash. La bibliothèque Python plotly est parfois appelée "plotly.py" pour la différencier de la bibliothèque JavaScript.

Grâce à l'intégration profonde avec notre utilitaire d'exportation d'images Kaleido, plotly fournit également un excellent support pour les contextes non Web, y compris les éditeurs de bureau (par exemple, QtConsole, Spyder, PyCharm) et la publication de documents statiques (par exemple, l'exportation de cahiers au format PDF avec des images vectorielles de haute qualité).

Ce guide de démarrage explique comment installer plotly et les pages optionnelles associées. Une fois l'installation terminée, vous pouvez utiliser notre documentation de trois manières principales :

  1. Tu sautes directement dans exemples sur la façon de créer des graphiques de base, des graphiques statistiques, des graphiques scientifiques, des graphiques financiers, des cartes et des graphiques en 3 dimensions.
  2. Si vous préférez vous renseigner sur le fondamentaux de la bibliothèque d'abord, vous pouvez lire sur la structure des figures, comment créer et mettre à jour des figures, comment afficher des figures, comment thématiser des figures avec des modèles, comment exporter des figures vers différents formats et sur Plotly Express, l'API de haut niveau pour faire tout ce qui précède.
  3. Vous pouvez consulter notre exhaustif référence guides : la référence de l'API Python ou la référence de la figure

Pour plus d'informations sur l'utilisation de Python pour créer des applications Web contenant des figures de tracé, consultez le Guide de l'utilisateur du tableau de bord.

Nous vous encourageons également à rejoindre le forum de la communauté Plotly si vous souhaitez de l'aide pour tout ce qui concerne plotly.

Installation¶

plotly peut être installé en utilisant pip :

Ce package contient tout ce dont vous avez besoin pour écrire des figures dans des fichiers HTML autonomes.


Démarrer avec un projet dans PyCharm

Tout ce que vous faites dans PyCharm, vous le faites dans le cadre d'un projet. Il sert de base à l'aide au codage, à la refactorisation en bloc, à la cohérence du style de codage, etc. Vous avez trois options pour commencer à travailler sur un projet dans l'IDE :

Ouvrir un projet existant

Commencez par ouvrir l'un de vos projets existants stockés sur votre ordinateur. Vous pouvez en sélectionner un dans la liste des projets récents sur l'écran d'accueil ou cliquer sur Ouvrir :

Sinon, vous pouvez créer un projet pour vos fichiers sources existants. Sélectionnez la commande Ouvrir dans le menu Fichier, et spécifiez le répertoire où existent les sources. PyCharm créera ensuite pour vous un projet à partir de vos sources. Reportez-vous à la section Importation d'un projet à partir d'un code source existant pour plus de détails.

Extraire un projet existant depuis Version Control

Vous pouvez également télécharger des sources à partir d'un stockage ou d'un référentiel VCS. Choisissez Git (GitHub), Mercurial, Subversion, Perforce (pris en charge dans l'édition Professional uniquement), puis entrez vos informations d'identification pour accéder au stockage.

Ensuite, entrez un chemin vers les sources et clonez le référentiel sur l'hôte local :

Reportez-vous à la section Contrôle de version pour plus de détails.

Créer un nouveau projet

Pour créer un projet, effectuez l'une des opérations suivantes :

Dans le menu principal, choisissez Fichier | Nouveau projet

Sur l'écran de bienvenue, cliquez sur Nouveau projet

Dans PyCharm Community, vous ne pouvez créer que des projets Python, alors qu'avec PyCharm Professional, vous disposez de diverses options pour créer un projet de framework Web.

Lors de la création d'un nouveau projet, vous devez spécifier un interpréteur Python pour exécuter le code Python dans votre projet. Vous avez besoin d'au moins une installation Python disponible sur votre machine.

Pour un nouveau projet, PyCharm crée un environnement virtuel isolé : venv, pipenv ou Conda. Au fur et à mesure que vous travaillez, vous pouvez le modifier ou créer de nouveaux interprètes. Vous pouvez également prévisualiser rapidement les packages installés pour vos interprètes et ajouter de nouveaux packages dans la fenêtre de l'outil Python Package.


2 réponses 2

Vous devez éviter les sous-processus et implémenter la fonctionnalité de sed avec Python à la place, par ex. avec le module fileinput :

Avec subprocess.call , chaque argument de la commande doit être un élément distinct de la liste (et shell ne doit pas être défini sur True ):

Ou, la commande entière doit être une chaîne, avec shell=True :

Les arguments sont traités de la même manière pour subprocess.call et Popen , et comme le dit la documentation pour subprocess.Popen :

Sous Unix avec shell=True , le shell par défaut est /bin/sh . … Si args est une séquence, le premier élément spécifie la chaîne de commande et tous les éléments supplémentaires seront traités comme des arguments supplémentaires pour le shell lui-même. C'est-à-dire que Popen fait l'équivalent de :


Créer les projets C++ de base

Suivez les instructions de cette section pour créer deux projets C++ identiques, code ultrarapide et superfastcode2. Plus tard, vous utiliserez une approche distincte dans chaque projet pour exposer le code C++ à Python.

Dans Explorateur de solution, cliquez avec le bouton droit sur la solution, puis sélectionnez Ajouter > Nouveau projet. Une solution Visual Studio peut contenir à la fois des projets Python et C++, ce qui est l'un des avantages de l'utilisation de Visual Studio pour Python.

Rechercher sur C++, sélectionnez Projet vide, spécifiez soit code ultrarapide pour le premier projet ou superfastcode2 pour le deuxième projet, puis sélectionnez d'accord.

Alternativement, avec les outils de développement natifs Python installés dans Visual Studio, vous pouvez commencer avec le modèle Python Extension Module. Le modèle contient déjà une grande partie de ce qui est décrit ici.

Pour cette procédure pas à pas, cependant, commencer par un projet vide illustre la construction du module d'extension étape par étape. Après avoir compris le processus, vous pouvez utiliser le modèle pour gagner du temps lorsque vous écrivez vos propres extensions.

Pour créer un fichier C++ dans le nouveau projet, cliquez avec le bouton droit sur le Fichiers source nœud, puis sélectionnez Ajouter > Nouvel article.

Sélectionner Fichier C++, nomme le module.cpp, puis sélectionnez d'accord.

Un fichier avec le .cpp est nécessaire pour activer les pages de propriétés C++ dans les étapes qui suivent.

Dans la barre d'outils principale, utilisez le menu déroulant pour effectuer l'une des opérations suivantes :

  • Pour un runtime Python 64 bits, activez le x64 configuration.
  • Pour un runtime Python 32 bits, activez le Win32 configuration.

Dans Explorateur de solution, cliquez avec le bouton droit sur le projet C++, sélectionnez Propriétés, puis procédez comme suit :

une. Pour Configuration, Entrer Actif (débogage).
b. Pour Plate-forme, entrez soit Actif (x64) ou alors Actif (Win32), en fonction de votre sélection à l'étape précédente.

Lorsque vous créez vos propres projets, vous souhaiterez configurer à la fois le déboguer et Libération configuration. Dans cette unité, vous configurez uniquement la configuration de débogage et la configurez pour utiliser une version de version de CPython. Cette configuration désactive certaines fonctionnalités de débogage du runtime C++, y compris les assertions. Utilisation des binaires de débogage CPython (python_d.exe) nécessite des paramètres différents.

Définissez les propriétés comme décrit dans le tableau suivant :

Languette Biens Valeur
Général Nom de la cible Spécifiez le nom du module pour y faire référence depuis Python dans from. déclarations d'importation. Vous utilisez ce même nom dans le code C++ lorsque vous définissez le module pour Python. Pour utiliser le nom du projet comme nom de module, laissez la valeur par défaut de

Testez le code et comparez les résultats

Maintenant que vous disposez des DLL structurées en extensions Python, vous pouvez vous y référer à partir du projet Python, importer les modules et utiliser leurs méthodes.

Rendre la DLL disponible pour Python

Vous pouvez mettre la DLL à la disposition de Python de plusieurs manières. Voici deux approches à considérer :

Cette première méthode fonctionne si le projet Python et le projet C++ sont dans la même solution. Procédez comme suit :

Dans Explorateur de solution, cliquez avec le bouton droit sur le Les références nœud dans votre projet Python, puis sélectionnez Ajouter une référence.

Dans la boîte de dialogue qui apparaît, sélectionnez le Projets onglet, sélectionnez à la fois le code ultrarapide et superfastcode2 projets, puis sélectionnez d'accord.

Une méthode alternative installe le module dans votre environnement Python, ce qui le rend également disponible pour d'autres projets Python. Pour plus d'informations, consultez le outils de configuration documentation du projet. Procédez comme suit :

Créer un fichier nommé setup.py dans le projet C++ en cliquant avec le bouton droit sur le projet et en sélectionnant Ajouter > Nouvel article.

Sélectionner Fichier C++ (.cpp), nommez le fichier setup.py, puis sélectionnez d'accord.

Nommer le fichier avec le .py L'extension permet à Visual Studio de le reconnaître comme un fichier Python malgré l'utilisation du modèle de fichier C++.

Lorsque le fichier apparaît dans l'éditeur, collez-y le code suivant, en fonction de la méthode d'extension :

Pour les extensions CPython (projet superfastcode):

Pour PyBind11 (projet superfastcode2):

Créez un deuxième fichier nommé pyproject.toml dans le projet C++ et collez-y le code suivant :

Pour créer l'extension, cliquez avec le bouton droit de la souris sur l'ouverture pyproject.toml onglet, puis sélectionnez Copier le chemin complet. Vous supprimerez le pyproject.toml nom du chemin avant de l'utiliser.

Dans Explorateur de solution, cliquez avec le bouton droit sur l'environnement Python actif, puis sélectionnez Gérer les packages Python.

Si vous avez déjà installé le package, vous le verrez répertorié ici. Avant de continuer, cliquez sur le X pour le désinstaller.

Dans la zone de recherche, collez le chemin copié, supprimez pyproject.toml à partir de la fin, puis sélectionnez Entrée pour installer le module à partir de ce répertoire.

Si l'installation échoue en raison d'une erreur d'autorisation, ajoutez --utilisateur jusqu'à la fin et réessayez la commande.

Appeler la DLL depuis Python

Après avoir rendu la DLL disponible pour Python, comme décrit dans la section précédente, vous pouvez appeler les fonctions superfastcode.fast_tanh et superfastcode2.fast_tanh2 à partir du code Python et comparer leurs performances à l'implémentation Python. Pour appeler la DLL, procédez comme suit :

Ajoutez les lignes suivantes dans votre .py file pour appeler les méthodes qui ont été exportées à partir des DLL et afficher leurs sorties :

Exécutez le programme Python en sélectionnant Déboguer > Démarrer sans déboguer ou en sélectionnant Ctrl+F5.

Si la Démarrer sans déboguer la commande est désactivée, dans Explorateur de solution, cliquez avec le bouton droit sur le projet Python, puis sélectionnez Définir comme projet de démarrage.

Notez que les routines C++ s'exécutent environ cinq à vingt fois plus rapidement que l'implémentation Python. La sortie typique apparaît comme suit :

Essayez d'augmenter la variable COUNT pour que les différences soient plus prononcées.

UNE déboguer build du module C++ s'exécute également plus lentement qu'un Libération build, car la version de débogage est moins optimisée et contient diverses vérifications d'erreurs. N'hésitez pas à basculer entre ces configurations à des fins de comparaison, mais n'oubliez pas de revenir en arrière et de mettre à jour les propriétés que vous avez définies précédemment pour la configuration de la version.

Dans la sortie, vous pouvez voir que l'extension PyBind11 n'est pas aussi rapide que l'extension CPython, bien qu'elle devrait être nettement plus rapide que l'implémentation Python pure. Cette différence est en grande partie due au fait que vous avez utilisé l'appel METH_O, qui ne prend pas en charge plusieurs paramètres, noms de paramètres ou arguments de mots clés. PyBind11 génère un code légèrement plus complexe pour fournir une interface plus proche de Python aux appelants. Mais, étant donné que le code de test appelle la fonction 500 000 fois, les résultats pourraient considérablement amplifier cette surcharge !

Vous pouvez réduire davantage la surcharge en déplaçant la boucle for dans le code natif. Cette approche impliquerait d'utiliser le protocole itérateur (ou le type PyBind11 py::iterable pour le paramètre de fonction) pour traiter chaque élément. La suppression des transitions répétées entre Python et C++ est un moyen efficace de réduire le temps nécessaire pour traiter la séquence.

Résoudre les erreurs d'importation

Si vous recevez un message ImportError lorsque vous essayez d'importer votre module, vous pouvez le résoudre de l'une des manières suivantes :

Lorsque vous construisez via une référence de projet, assurez-vous que les propriétés de votre projet C++ correspondent à l'environnement Python activé pour votre projet Python, en particulier le Comprendre et Une bibliothèque répertoires.

Assurez-vous que votre fichier de sortie est nommé superfastcode.pyd. Tout autre nom ou extension empêchera son importation.

Si vous avez installé votre module en utilisant le setup.py fichier, vérifiez que vous avez exécuté le pépin dans l'environnement Python qui est activé pour votre projet Python. L'expansion de l'environnement Python dans l'Explorateur de solutions devrait afficher une entrée pour code ultrarapide.

ltNomProjet>
. Pour python_d.exe , ajoutez _d à la fin du nom.
Type de configuration Bibliothèque dynamique (.dll)
Avancée > Extension de fichier cible .pyd
Valeurs par défaut du projet > Type de configuration Bibliothèque dynamique (.dll)
C/C++ > Général Répertoires d'inclusion supplémentaires Ajouter le Python comprendre dossier approprié pour votre installation (par exemple, c:Python36include ).
C/C++ > Préprocesseur Définitions du préprocesseur S'il est présent, modifiez le _DÉBOGUER valeur à NDEBUG pour correspondre à la version sans débogage de CPython. Lorsque vous utilisez python_d.exe, laissez cette valeur inchangée.
C/C++ > Génération de code Bibliothèque d'exécution DLL multithread (/MD) pour correspondre à la version sans débogage de CPython. Lorsque vous utilisez python_d.exe, laissez cette valeur comme DLL de débogage multithread (/MDd).
Éditeur de liens > Général Répertoires de bibliothèque supplémentaires Ajouter le Python bibliothèques dossier qui contient .lib fichiers, en fonction de votre installation (par exemple, c:Python36libs). Assurez-vous de pointer vers le bibliothèques dossier qui contient .lib fichiers, et ne pas les Lib dossier qui contient .py des dossiers.
Languette Biens Valeur
Général Général > Nom de la cible Spécifiez le nom du module pour y faire référence depuis Python dans from. déclarations d'importation. Vous utilisez ce même nom dans le code C++ lorsque vous définissez le module pour Python. Pour utiliser le nom du projet comme nom de module, laissez la valeur par défaut de

Approches alternatives

Vous pouvez créer des extensions Python de différentes manières, comme décrit dans le tableau suivant. Les deux premières lignes, CPython et PyBind11 , sont abordées dans cet article.

Approcher Ancien Utilisateurs représentatifs
Modules d'extension C/C++ pour CPython 1991 Bibliothèque standard
PyBind11 (recommandé pour C++) 2015
Cython (recommandé pour C) 2007 gevent, kivy
HPy 2019
mypyc 2017
ctypes 2003 oscrypto
cffi 2013 cryptographie, pypy
LAMPÉE 1996 crfsuite
Boost.Python 2002
cppyy 2017

ltNomProjet>
. Pour python_d.exe , ajoutez _d à la fin du nom.
Général > Extension cible .pyd
Valeurs par défaut du projet > Type de configuration Bibliothèque dynamique (.dll)
C/C++ > Général Répertoires d'inclusion supplémentaires Ajouter le Python comprendre dossier, en fonction de votre installation (par exemple, c:Python36include).
C/C++ > Préprocesseur Définitions du préprocesseur S'il est présent, modifiez le _DÉBOGUER valeur à NDEBUG pour correspondre à la version sans débogage de CPython . Lorsque vous utilisez python_d.exe , laissez cette valeur inchangée.
C/C++ > Génération de code Bibliothèque d'exécution DLL multithread (/MD) pour correspondre à la version sans débogage de CPython . Lorsque vous utilisez python_d.exe , laissez cette valeur inchangée.
Éditeur de liens > Général Répertoires de bibliothèque supplémentaires Ajouter le Python bibliothèques dossier qui contient .lib fichiers, en fonction de votre installation (par exemple, c:Python36libs). Assurez-vous de pointer vers le bibliothèques dossier qui contient .lib fichiers, et ne pas les Lib dossier qui contient .py des dossiers.

Si la C/C++ n'est pas affiché dans les propriétés du projet, le projet ne contient aucun fichier qu'il identifie comme fichiers source C/C++. Cette condition peut se produire si vous créez un fichier source sans .c ou alors .cpp extension de fichier.

Par exemple, si vous avez accidentellement entré module.coo à la place de module.cpp plus tôt dans la boîte de dialogue du nouvel élément, Visual Studio crée le fichier mais ne définit pas le type de fichier sur Code C/C+, qui active l'onglet des propriétés C/C++. Une telle erreur d'identification persiste même si vous renommez le fichier avec un .cpp extension de fichier.

Pour définir correctement le type de fichier, dans Explorateur de solution, cliquez avec le bouton droit sur le fichier et sélectionnez Propriétés. Puis pour Type de fichier, sélectionnez Code C/C++.

Pour tester vos configurations (tant déboguer et Libération), cliquez avec le bouton droit sur le projet C++, puis sélectionnez Construire.

Vous trouverez le .pyd fichiers dans le Solution dossier, sous Déboguer et Libérer, pas dans le dossier du projet C++ lui-même.

Dans le projet C++ module.cpp fichier, ajoutez le code suivant :

Générez à nouveau le projet C++ pour confirmer que votre code est correct.

Si vous ne l'avez pas déjà fait, répétez les étapes précédentes pour créer un deuxième projet nommé superfastcode2 avec une configuration identique.


Bâtiment PySide

1.2.4 (2015-10-14)

Liste complète des modifications et corrections de bugs

Configuration PySide

1.2.3 (2015-10-12)

Liste complète des modifications et corrections de bugs

PySide

Shiboken

  • Ne pas ignorer les classes en topologie
  • Traiter les énumérations globales dans l'ordre de déclaration
  • Renvoyer les énumérations dans l'ordre de déclaration (ordre ajouté)

Configuration PySide

1.2.2 (2014-04-24)

Liste complète des modifications et corrections de bugs

PySide

  • Correction de PYSIDE-190 : QCoreApplication se verrait bloqué à la sortie si le QThreadPool.globalInstance() global exécute un QRunnable avec du code python
  • Modifiez GlobalReceiver pour explicitement « utiliser » [dis]connectNotify de la classe de base afin d'éviter de les masquer avec ses propres surcharges.
  • Ajouter des transtypages explicites lors de l'initialisation d'un int[] à l'aide de <>, comme requis par C++11 pour être "bien formé"
  • Correction de PYSIDE-172 : plusieurs règles pour le fichier
  • Utilisez l'encodage du système de fichiers au lieu de « ascii » supposé lors de l'enregistrement de qt.conf dans le système de ressources Qt

Shiboken

  • Supprimer les lignes de rejet qui provoquent l'échec du test sample_list
  • Supprimer protégé du test de liaison d'échantillons
  • Ajouter l'analyse du mot-clé « noexcept »
  • Correction des rejets de fonctions (c'est-à-dire des surcharges de support)
  • Correction de la construction avec python 3.3 et 3.4
  • Doc: Arrêtez d'exiger sphinx.ext.refcounting avec Sphinx 1.2+
  • Correctif pour les conteneurs avec des valeurs « const »
  • Correction d'un problème de compilation sur OS X 10.9
  • Utilisez uniquement des champs dans PyTypeObject lors de la définition des types
  • Correction des définitions de macro de traitement de dépassement de mémoire tampon
  • Correction « spéciale » inclut la gestion
  • Correction de la recherche de classes de base de conteneurs
  • Refactoriser et améliorer la résolution des fonctions ajoutées
  • Contourner le <cmath> déficient de MSVC dans libsample/transform.cpp
  • Correction de la description du test unitaire d'échantillon/de transformation
  • Modifier l'habillage et l'indentation de certains codes dans Handler::startElement pour améliorer la cohérence
  • Correction de la substitution '%#' pour # > 9
  • Améliorer les dépendances pour les tests

1.2.1 (2013-08-16)

Changements majeurs

PySide

Shiboken

  • Meilleure prise en charge de plus de 9 arguments aux méthodes
  • Éviter une erreur de segmentation lors de l'obtention de l'attribut .name sur une valeur enum sans nom

Configuration PySide

  • Passé aux nouveaux outils de configuration (v0.9.8) qui ont été fusionnés à nouveau avec Distribute et fonctionnent pour Python 2 et 3 avec une seule base de code
  • Prise en charge de la création de binaires Windows avec uniquement le SDK Windows installé (Visual Studio n'est plus requis)
  • Suppression de l'option –msvc-version. La version requise du compilateur msvc est maintenant résolue à partir de la version de l'interpréteur python

1.2.0 (2013-07-02)

Changements majeurs

PySide
  • Correction de plusieurs erreurs de segmentation et meilleur suivi de la durée de vie des objets Qt
  • Correction de plusieurs fuites de mémoire
Shiboken
Configuration PySide
  • Sur le système Windows, lors de l'installation de la distribution binaire PySide via easy_install, il n'est plus nécessaire d'appeler le script de post-installation
  • Prise en charge de la création de binaires Windows en dehors de l'invite de commande Visual Studio
  • Construire et empaqueter les documents shiboken lorsque sphinx est installé

Liste complète des modifications et corrections de bugs

PySide
  • Configurer correctement PYTHONPATH pour les tests
  • Correction d'une erreur de segmentation potentielle à l'arrêt
  • Correction de PYSIDE-61
  • Dites à Qt de rechercher les importations qml dans le package PySide
  • correction de la construction en mode C++11
  • Correction d'une fuite de mémoire QByteArray
  • Ignorer les erreurs d'importation QtCore lors de l'initialisation du dossier des plugins
  • Préchargez les DLL OpenSSL sous Windows.
  • Regardez d'abord dans le package PySide pour le dossier des plugins de Qt, au lieu de simplement dans le dossier d'installation ou de construction de Qt
  • Ajouter une conversion de type explicite pour corriger l'erreur de compilation mingw
  • Utilisez la propriété QObject pour invalider le wrapper avant la suppression
  • Invalider le wrapper metaObject avant la suppression
  • Correction d'une fuite de référence lors de la conversion d'un type de carte C++ en dict Python
  • Changez l'ordre des répertoires pysitetest et signaux car signaux/disconnect_test.py dépend du module pysidetest
Shiboken
  • Suppression des anciens logos des documents html
  • Ajouter un retour manquant sur l'erreur d'initialisation du module
  • Ne pas casser -Werror=non-virtual-dtor
  • Correction du test de shiboken pour un test de liaison minimal
  • Decref référence à l'objet de type
  • Correction d'une erreur de segmentation lors de l'utilisation de shiboken.delete
  • Utiliser la méthode non statique def pour les méthodes d'instance
  • Correction d'un bug introduit lors de l'ajout de recursive_invalidate
  • correction de la construction en mode C++11
  • Empêcher la récursivité infinie dans invalidate
  • Correction d'un conflit possible avec le ramasse-miettes
  • Correction d'un crash possible à la sortie
  • Correction de la gestion des non signés long long et fourniture de tests unitaires
  • Ajouter un test pour illustrer le problème sur l'énumération typedef
  • Utilisez getWrapperForQObject pour convertir si vous générez pour PySide
  • Autoriser la compilation sans bibliothèque partagée python
  • Utiliser le métaObject de la classe parente si le wrapper est NULL
  • Affirmation facultative sur un pointeur libre avec un wrapper valide
  • Trouver les bibliothèques python3 lorsqu'elles sont construites avec pydebug activé
  • Correction du bogue PYSIDE-108 et ajout d'un exemple
  • PYSIDE-83 Correction d'une erreur de segmentation appelant shiboken.dump
  • Correction et test du bogue PYSIDE-72
  • Remplacer toutes les fonctions avec le même nom, pas une seule
  • Mettre à jour la conversion vectorielle
  • Ajouter des exemples de typedef au minimum
  • Ajouter les fichiers de test à cmake
  • Ne l'utilisez pas->seconde après l'avoir effacé
  • Trouvez les modifications de fonction définies dans la classe de base 2nd+. Corrige le bug PYSIDE-54.
  • Définissez une fonction de hachage par défaut pour tous les types d'objets. Correction du bug PYSIDE-42.
  • Correction de la compilation lorsqu'aucune libxslt n'est installée sur le système.
  • Correction de la résolution de SOABI. SOABI est implémenté sous Linux, mais pas sous Windows
  • N'utilisez pas de méthodes en ligne dans les classes dllexported pour satisfaire VC++
  • Utiliser SpooledTemporaryFile dans 2.6+ os.tmpfile() échoue sur win32 si le processus n'a pas d'autorisations d'administrateur
Configuration PySide
  • Prise en charge de la création de binaires Windows en dehors de l'invite de commande Visual Studio
  • Construire et empaqueter les documents shiboken lorsque sphinx est installé
  • Prise en charge d'Ubuntu 13.04 et Fedora 18
  • Correction de la commande setuptools « developper »
  • Mises à jour de la documentation
  • Ajouter l'option –build-tests pour permettre la construction des tests
  • Ajouter les options –jom et –jobs
  • Ajoutez l'option –no-examples pour exclure les exemples
  • Ajoutez l'option –relwithdebinfo pour activer un mode de construction release-with-debug-info
  • Ajouter l'option –ignore-git
  • Ajouter l'option –make-spec pour spécifier le générateur de make

1.1.2 (2012-08-28)

Corrections de bugs

  • Pendant l'émission du signal, n'obtenez pas le type de retour après le rappel
  • Invalider QStandardModel::invisibleRootItem dans la méthode clear()
  • QAbstractItemModel a une mauvaise politique de propriété pour selectionModel()
  • Conversion améliorée de QVector en python
  • Désactivez la génération de docstring si les outils ne sont pas trouvés.
  • Correction de quelques problèmes de compilation de PySide en utilisant VC++
  • Installer le module shiboken sur les packages de site
  • Correction de la compilation lorsqu'aucune libxslt n'est installée sur le système.
  • Définissez une fonction de hachage par défaut pour tous les types d'objets.
  • Correction d'une erreur de segmentation en appelant shiboken.dump

1.1.1 (2012-04-19)

Changements majeurs

  • Chaîne d'outils unifiée ! Plus de GeneratorRunner et d'ApiExtractor, il vous suffit maintenant de Shiboken pour compiler PySide.

Corrections de bugs

  • 1105 Spyder échoue avec HEAD
  • 1126 Segfault lorsqu'une exception est déclenchée dans signalInstanceDisconnect
  • 1135 SIGSEGV lors du chargement du widget personnalisé à l'aide de QUiLoader lors du remplacement de createWidget()
  • 1041 QAbstractItemModel a une mauvaise stratégie de propriété pour selectionModel()
  • 1086 traitement des erreurs de segmentation Generatorrunner #include
  • 1110 Une erreur de simultanéité provoque une corruption du tas du GC
  • 1113 L'instanciation de QObject dans le constructeur de l'élément QML défini par l'utilisateur plante si elle est instanciée à partir de QML
  • 1129 Erreur de segmentation à la fermeture par QStandardItem/QStandardItemModel
  • 1104 QSettings a des problèmes avec les entiers longs
  • 1108 tests/QtGui/pyside_reload_test.py échoue lorsque l'écriture de bytecode est désactivée
  • 1138 Le sous-classement de QUiLoader conduit à une exception « objet C++ interne déjà supprimé » (à nouveau)
  • 1124 QPainter.drawPixmapFragments devrait prendre une liste comme premier argument
  • 1065 Exemple non valide dans la documentation QFileDialog
  • 1092 shiboken se nomme « générateur »
  • 1094 shiboken ne se plaint pas des options invalides
  • 1044 Appel incorrect au constructeur parent dans l'exemple
  • 1139 Crash à la sortie car l'état du thread (tstate) est NULL
  • PYSIDE-41 QModelIndex non illisible

1.1.0 (2012-01-02)

Changements majeurs

Corrections de bugs

  • Patch 1010 Shiboken Cygwin
  • 1034 Erreur lors de la compilation de PySide avec Python 3.2.2 32 bits sous Windows
  • 1040 attributs d'écrasement pyside-uic avant qu'ils ne soient utilisés
  • 1053 pyside-lupdate utilisé avec les fichiers .pro ne peut pas gérer les chemins Windows contenant des espaces
  • 1060 Le sous-classement de QUiLoader conduit à une exception « objet C++ interne déjà supprimé »
  • 1063 Bug d'écriture dans des fichiers à l'aide de « QTextStream + QFile + QTextEdit » sur Linux
  • 1069 QtCore.QDataStream échoue silencieusement lors de l'écriture de la chaîne Python
  • 1077 Blocage de la sortie de l'application lors de l'appel de QSyntaxHighlighter.document()
  • 1082 liens binaires OSX sont rompus
  • 1083 winId renvoie un PyCObject rendant impossible la comparaison de deux winId
  • 1084 Crash (segfault) lors de l'écriture de la chaîne Unicode sur le socket
  • 1091 PixmapFragment et drawPixmapFragments ne sont pas liés
  • 1095 Pas d'exemples pour le tutoriel shiboken
  • 1097 QtGui.QShortcut.setKey nécessite QKeySequence
  • 1101 Signaler les signatures de fonction non valides dans le typesystem
  • 902 Exposer la fonctionnalité Shiboken via un module Python
  • 969 viewOptions de l'erreur QAbstractItemView

1.0.9 (2011-11-29)

Corrections de bugs

  • 1058 Code étrange dans PySide/QtUiTools/glue/plugins.h
  • 1057 valgrind détecté « Saut ou mouvement conditionnel dépend de la valeur non initialisée »
  • 1052 PySideConfig.cmake contient une boucle infinie en raison d'une valeur par défaut manquante pour SHIBOKEN_PYTHON_SUFFIX
  • 1048 QGridLayout.itemAtPosition() se bloque alors qu'il devrait renvoyer Aucun
  • 1037 shiboken ne parvient pas à construire contre python 3.2 (à la fois normal et -dbg) sur i386 (et autres)
  • 1036 Qt.KeyboardModifiers évalue toujours à zéro
  • 1033 instances QDialog.DialogCode et valeur de retour du hachage QDialog.exec_ à différentes valeurs
  • 1031 QState.parentState() ou QState.machine() provoque un plantage de python à la sortie
  • 1029 qmlRegisterType ne parvient pas à augmenter le nombre de références
  • 1028 QWidget winId manquant
  • 1016 L'appel de la méthode Q_INVOKABLE ne renvoyant pas QVariant est impossible…
  • 1013 se connecter à QSqlTableModel.primeInsert() provoque un plantage
  • 1012 FTBFS avec indicateurs de durcissement activés
  • 1011 Patch PySide Cygwin
  • Patch 1010 Shiboken Cygwin
  • 1009 Patch GeneratorRunner Cygwin
  • 1008 correctif ApiExtractor Cygwin
  • 891 ApiExtractor ne prend pas en charge doxygen comme backend pour la génération de documents.

1.0.8 (2011-10-21)

Changements majeurs

Corrections de bugs

  • 1022 RuntimeError : profondeur de récursivité maximale dépassée lors de l'obtention de la str d'un objet
  • 1019 Le remplacement de QWidget.show ou QWidget.hide ne fonctionne pas
  • 944 Segfault sur QIcon(Aucun).pixmap()

1.0.7 (2011-09-21)

Corrections de bugs

  • 996 Dépendances manquantes pour QtWebKit dans les scripts de construction pour Fedora
  • 986 Liens de documentation
  • 985 Fournir un fichier zip pyside-docs versionné pour aider les emballeurs
  • Les documents de 981 QSettings devraient comprendre les changements de comportement de value() sur différentes plates-formes
  • 902 Exposer la fonctionnalité Shiboken via un module Python
  • 997 QDeclarativePropertyMap ne fonctionne pas.
  • 994 QIODevice.readData doit utiliser qmemcpy au lieu de qstrncpy
  • 989 Décapage QColor échoue
  • 987 Déconnexion d'un signal qui n'a pas été connecté
  • 973 shouldInterruptJavaScript slot override n'est jamais appelé
  • 966 QX11Info.display() manquant
  • 959 ne peut pas passer QVariant au pont QtWebkit
  • 1006 Segfault dans QLabel init
  • 1002 Défaut de segmentation à la sortie PySide/Spyder
  • 998 Segfault avec Spyder après le passage à une autre application
  • 995 QDeclarativeView.itemAt renvoie une référence erronée. (menant à SEGFAULT)
  • 990 Segfault en essayant de déconnecter un signal qui n'est pas connecté
  • 975 Fuite de mémoire possible
  • 991 Le __repr__ de divers types est cassé
  • 988 Le type fourni avec le signal currentChanged dans QTabWidget a changé dans 1.0.6

1.0.6 (2011-08-22)

Changements majeurs

  • Nouvelle mise en page de la documentation
  • Correction de quelques régressions par rapport à la dernière version (1.0.5)
  • Optimisations lors de la connexion anonyme

Corrections de bugs

  • 972 anchorlayout.py de l'exemple de graphicview a soulevé une exception de mémoire non inscriptible lors de la sortie
  • 953 Segfault lorsque QObject est récupéré après QTimer.singeShot
  • 951 ComponentComplete non appelé sur la sous-classe QDeclarativeItem
  • 965 Segfault dans QtUiTools.QUiLoader.load
  • 958 Erreur de segmentation avec les fichiers de ressources
  • 944 Segfault sur QIcon(Aucun).pixmap()
  • 941 signaux avec des types QtCore.Qt comme arguments ont des signatures non valides
  • 964 La méthode QAbstractItemView.moveCursor() est manquante
  • 963 Qu'est-ce que c'est n'affiche pas les informations d'en-tête de colonne QTableWidget comme dans Qt Designer
  • 961 QColor.__repr__/__str__ devrait être plus pythonique
  • 960 QColor.__reduce__ est incorrect pour les couleurs HSL
  • 950 mettre en œuvre Q_INVOKABLE
  • 940 setAttributeArray/setUniformValueArray ne prennent pas de tableaux
  • 931 isinstance() échoue avec les instances Signal
  • 928 100 de QGraphicItems avec des connexions de signal provoquent un ralentissement
  • 930 La documentation mélange signaux et fonctions.
  • 923 Faire en sorte que QScriptValue (ou QScriptValueIterator) implémente le protocole d'itérateur Python
  • 922 Le repr() de QScriptValue devrait donner des informations sur ses données
  • 900 QtCore.Property en tant que décorateur
  • La version 895 jQuery est obsolète, la déduplication du code de distribution interrompt la recherche de documentation
  • 731 Impossible de spécifier plus d'un seul argument "depuis"
  • 983 copy.deepcopy lève SystemError avec QColor
  • 947 NETWORK_ERR lors de l'interaction fenêtre QtWebKit avec le serveur
  • 873 Les méthodes dépréciées pourraient émettre un avertissement de dépréciation
  • 831 docs PySide auraient une liste « Hérité par » pour chaque classe

1.0.5 (2011-07-22)

Changements majeurs

  • Les widgets présents sur les fichiers "ui" sont exportés dans le widget racine, consultez le fil PySide ML pour plus d'informations[1]
  • pyside-uic génère des barres de menus sans parent sur la plate-forme MacOS
  • Optimisations de la connexion du signal

Corrections de bugs

  • 892 Segfault lors de la destruction de QWidget et QApplication a un filtre d'événement installé
  • 407 Crash lors d'un héritage multiple avec QObject et la classe python native
  • 939 Shiboken::importModule doit vérifier si PyImport_ImportModule réussit
  • 937 méthode pid manquante dans QProcess
  • 927 Erreur de segmentation sur le code QThread.
  • 925 Segfault lors du passage d'une QScriptValue en tant que QObject ou lors de l'utilisation de .toVariant() sur une QScriptValue
  • 905 L'appel de fonction QtGui.QHBoxLayout.setMargin est créé par pyside-uic, mais ce n'est pas disponible dans les liaisons pyside
  • 904 L'ouverture répétée d'un QDialog avec l'ensemble Qt.WA_DeleteOnClose plante PySide
  • 899 Segfault avec la propriété 'QVariantList'.
  • 893 Référence de fuite Shiboken dans le contrôle parent
  • 878 Shiboken peut générer des modules incompatibles si une nouvelle classe est ajoutée.
  • 938 QTemporaryFile problème JPEG
  • 934 Un __getitem__ de QByteArray se comporte étrangement
  • 929 fichiers pkg-config ne connaissent pas les balises de version Python
  • 926 qmlRegisterType ne fonctionne pas avec QObject
  • 924 Autoriser l'accès à QScriptValue via []
  • 921 Les signaux ne sont pas automatiquement déconnectés lors de la destruction de l'objet
  • 920 Impossible d'utiliser le même slot pour deux signaux
  • 919 Les arguments par défaut sur les méthodes QStyle ne fonctionnent pas
  • 915 QDeclarativeView.scene().addItem(x) rend l'objet x invalide
  • 913 Les widgets dans QTabWidget ne sont pas exportés en tant que membres du widget conteneur
  • 910 installEventFilter() incrémente le nombre de références sur l'objet cible
  • 907 pyside-uic ajoute MainWindow.setMenuBar(self.menubar) au code généré sous OS X
  • 903 eventFilter dans ItemDelegate
  • 897 Les méthodes QObject.property() et QObject.setProperty() échouent pour les propriétés définies par l'utilisateur
  • 896 QObject.staticMetaObject() est manquant
  • 916 Informations manquantes sur le moment où il est possible d'utiliser des arguments de mot-clé dans les documents [était : le constructeur de QListWidgetItem ignore le paramètre de texte]
  • 890 Ajouter un exemple de connexion de signal pour valueChanged(int) sur QSpinBox à la documentation
  • Interface de mappage 821 pour QPixmapCache
  • 909 La suppression de QMainWindow/QApplication entraîne un défaut de segmentation

Rassemblez vos matériaux

Tout d'abord, vous devez collecter ce dont vous avez besoin pour effectuer l'installation. Nous ferons tout notre travail dans $HOME/local/src . Vous devriez créer ce répertoire maintenant.

Ensuite, nous devrons télécharger le code source du package que nous voulons installer. Dans notre exemple, nous utiliserons "NumExpr", un package que nous fournissons déjà dans la version système de Python. Vous pouvez soit télécharger le fichier sur votre bureau, puis le télécharger sur OSC, soit le télécharger directement à l'aide de l'utilitaire wget (si vous connaissez l'URL du fichier).

Ensuite, extrayez le fichier téléchargé. Dans ce cas, puisqu'il s'agit d'un format "tar.gz", nous pouvons utiliser tar pour décompresser et extraire le contenu.

Vous pouvez supprimer l'archive téléchargée maintenant ou la conserver si vous souhaitez démarrer l'installation à partir de zéro.


6 réponses 6

When working with structured text like YAML or JSON or XML, you really should use a parser that "understands" the structure. There are several specific command-line tools for various kinds of structured text (e.g. xmlstarlet for xml, jq for json, and yq for yaml), and most programming/scripting languages have libraries for parsing and processing structured text.

Here's how to do it in perl, using the perl core YAML module:

(this requires a version of perl >= 5.14, which is when the YAML module was included as a standard part of the core module distribution. perl 5.14 was released in 2013. For earlier versions of perl, you can install YAML with cpan ).

Save this as, e.g. yaml.pl and make it executable with chmod +x yaml.pl .

If your yaml data is save in a file called input.yaml , you can run it like this:

Like awk or sed, this can also be condensed into an inscrutable one-liner:


5 réponses 5

Since some pages that I edit actually need trailing whitespaces (e.g. markdown) and others don't, I set up a keybinding to F5 so that it's trivial to do without being automatic. To do so, add the code below (from vim.wikia) or some variation of it to your .vimrc :

  • nnoremap <F5> does a nonrecursive mapping to the key F5 in normal mode
  • :let [email protected]/ stores the last search term (from the macro @/ ) in the variable _s
  • <Bar> Functions as a pipe symbol | to separate commands, however | would end a command in this context, so <Bar> must be used instead.
  • :%s/s+$//e searches for trailing whitespace and deletes it everywhere in the buffer (see CarpetSmoker's answer for a detailed breakdown of this expression)
  • let @/=_s restores your last search term to the macro @/ , so that it will be available the next time you hit n .
  • <CR> ends the mapping

vim-plug is a nice alternative to Vundle, it does things a bit different from a technical point of view which should make it faster (see this). It has most (or all?) of the features of Vundle.

  • Parallel update procedure for Vim with any of +ruby , +python , or Neovim. Falls back to sequential mode using Vimscript if none is available.
  • Lazy loading, for faster startup (see this).
  • Install plugins.
  • Update plugins.
  • Review / rollback updates.
  • Supports OSX, Linux & UNIX systems, and MS Windows.
  • Post-update hooks e.g. automatically recompile YCM

to install the listed plugins.

/ (i.e. under your home directory) &ndash user637338 Mar 29 at 14:42

Pathogen is simple. Essentially it just does:

To install it download pathogen.vim to

If you don't like to get crazy, only call :Helptags when you need to.

Plugins are then added to

/.vim/bundle (i.e. the default location, you can change this), it adds the plugin's files to vim's runtimepath so they are accessible. The manually installing, updating, removing is not really a con if you don't have that many plugins installed. Additionally, when updating plugins, you can choose to fetch only a subset of the changes, and not update to the latest version of a plugin, which gives you a lot of control. &ndash akshay Feb 5 '15 at 3:24

/.vim/doc). Provided with pathogen.vim is a :Helptags command that does this on every directory in your 'runtimepath'. If you really want to get crazy, you could even invoke Helptags in your vimrc. I don't like to get crazy." I'd say if you have a lot of plugins, this might slow down startup a bit. And you really don't need to run it at every startup, once for each plugin installation/upgrade should be enough. &ndash muru May 27 '15 at 4:35

Vundle is more complex. It is a package manager à la apt or yum for plugins. It can:

  • search a plugin index
  • update plugins
  • generate helptags automatically
  • keep, but not use, plugins in the autoload folder
  • clean out such unused plugins
  • Works on Linux, OSX, and MS Windows

And then add to your .vimrc :

To install a plugin, use the Plugin command in .vimrc (more examples on the Github README):

And then call :PluginInstall from .vim (or vim +PluginInstall +qall ).

Both Vim 8.0 and Neovim have their own built-in package manager. In Vim 8.0 create the following directories: .vim/pack/*/start , where * is any name you want to use e.g. .vim/pack/jimmy/start .

Clone your plugin into the start directory just as you would if you were using pathogen.

With Neovim, the directories are a little more longwinded:

.local/share/nvim/site/pack/*/start . From there do the same as for Vim.

There is no need at all for another plugin manager.

In Vim or Neovim, run :h packages for a little more detail. Read the part about colours because they are different, though not much. You need no extra instructions in your .vimrc or your nvim/init.vim files.

dein.vim: As a follow up of this question, I'll add here the plugin manager made by the well-known Shougo.

According to the README, the plugin has the following dependencies:

  • Vim >7.4 or neovim : while keeping Vim up to date is a good thing, it may be problematic for some users that previous versions are not supported
  • git : which is pretty common for a package manager
  • rsync : which is not as common as git

The author claims that it is faster than NeoBundle. A benchmark can be found on the project's readme page.

One original concept of this plugin manager is that it does not provide any commands, but only functions: for example, to update your plugins you can't use something like :PlugUpdate , you'll have to call: :call dein#update() . To be honest I haven't found an explication of this design choice.

Also, someone created a plugin which provides these "missing" commands. I have no idea if this is a good idea or if this is against the main idea of the plugin manager but the author mentions it in the FAQ of the doc file.

Dein.vim supports getting plugins from Github (with a facilitated access to plugins from vimscript.org) and from local directories.

The plugin manager provides some classical features like updating and disabling the plugins. It also allows the execution of hooks at installation time.

Note that according to the FAQ, it seems you have to manually build the helptags of the plugins it installs.

An interesting point is that the author wants dein.vim to be easy to test and to maintain so the repository also contains some test scripts.

Finally, I'd say that this plugin manager seems to be designed to be lightweight and fast, which is interesting, but I think it is less user-friendly than vim-plug or Vundle, for example.