Más

¿Cómo llamar a la herramienta predeterminada en el complemento interno de QGIS usando un script de Python?


Quiero crear un complemento que pueda dibujar polígonos irregulares en QGIS. Por eso, quiero llamar al Seleccionar funciones a mano alzada herramienta predeterminada dentro de mi complemento. ¿Cómo puedo hacer esto dentro de un script de Python?


Esto debería funcionar:

iface.actionSelectFreehand (). trigger ()

Introducción a Plotly en Python

Plotly es una biblioteca de gráficos gratuita y de código abierto para Python. Le recomendamos que lea nuestra guía de introducción para obtener las últimas instrucciones de instalación o actualización, luego continúe con nuestros tutoriales de Plotly Fundamentals o se sumerja directamente en algunos tutoriales de Basic Charts.

Descripción general & # 182

La biblioteca plotly de Python es una biblioteca de trazado interactiva de código abierto que admite más de 40 tipos de gráficos únicos que cubren una amplia gama de casos de uso estadísticos, financieros, geográficos, científicos y tridimensionales.

Construido sobre la biblioteca Plotly JavaScript (plotly.js), plotly permite a los usuarios de Python crear hermosas visualizaciones interactivas basadas en la web que se pueden mostrar en cuadernos de Jupyter, guardar en archivos HTML independientes o servir como parte de una web pura construida en Python. aplicaciones que utilizan Dash. La biblioteca plotly de Python a veces se denomina "plotly.py" para diferenciarla de la biblioteca JavaScript.

Gracias a la integración profunda con nuestra utilidad de exportación de imágenes de Kaleido, plotly también proporciona un gran soporte para contextos no web, incluidos editores de escritorio (por ejemplo, QtConsole, Spyder, PyCharm) y publicación de documentos estáticos (por ejemplo, exportar cuadernos a PDF con imágenes vectoriales de alta calidad).

Esta guía de introducción explica cómo instalar plotly y páginas opcionales relacionadas. Una vez que haya instalado, puede utilizar nuestra documentación de tres formas principales:

  1. Saltas directamente a ejemplos de cómo hacer gráficos básicos, gráficos estadísticos, gráficos científicos, gráficos financieros, mapas y gráficos tridimensionales.
  2. Si prefiere aprender sobre el fundamentos de la biblioteca primero, puede leer sobre la estructura de las figuras, cómo crear y actualizar figuras, cómo mostrar figuras, cómo crear un tema de figuras con plantillas, cómo exportar figuras a varios formatos y sobre Plotly Express, la API de alto nivel por hacer todo lo anterior.
  3. Puede consultar nuestro exhaustivo referencia guías: la referencia de la API de Python o la referencia de la figura

Para obtener información sobre el uso de Python para crear aplicaciones web que contengan figuras gráficas, consulte la Guía del usuario de Dash.

También te animamos a que te unas al Foro de la comunidad de Plotly si quieres ayuda con cualquier tema relacionado con Plotly.

Instalación & # 182

plotly se puede instalar usando pip:

Este paquete contiene todo lo que necesita para escribir cifras en archivos HTML independientes.


Comience con un proyecto en PyCharm

Todo lo que hace en PyCharm, lo hace dentro del contexto de un proyecto. Sirve como base para la asistencia de codificación, la refactorización masiva, la coherencia del estilo de codificación, etc. Tiene tres opciones para comenzar a trabajar en un proyecto dentro del IDE:

Abrir un proyecto existente

Comience abriendo uno de sus proyectos existentes almacenados en su computadora. Puede seleccionar uno en la lista de proyectos recientes en la pantalla de bienvenida o hacer clic en Abrir:

De lo contrario, puede crear un proyecto para sus archivos fuente existentes. Seleccione el comando Abrir en el menú Archivo y especifique el directorio donde existen las fuentes. PyCharm luego creará un proyecto a partir de sus fuentes para usted. Consulte la sección Importación de un proyecto desde un código fuente existente para obtener más detalles.

Consulte un proyecto existente de Control de versiones

También puede descargar fuentes desde un depósito o almacenamiento VCS. Elija Git (GitHub), Mercurial, Subversion, Perforce (compatible solo en la edición Professional) y luego ingrese sus credenciales para acceder al almacenamiento.

Luego, ingrese una ruta a las fuentes y clone el repositorio en el host local:

Consulte la sección Control de versiones para obtener más detalles.

Crea un nuevo proyecto

Para crear un proyecto, realice una de las siguientes acciones:

En el menú principal, elija Archivo | Nuevo proyecto

En la pantalla de bienvenida, haga clic en Nuevo proyecto

En PyCharm Community, puede crear solo proyectos de Python, mientras que, con PyCharm Professional, tiene una variedad de opciones para crear un proyecto de marco web.

Al crear un nuevo proyecto, debe especificar un intérprete de Python para ejecutar el código Python en su proyecto. Necesita al menos una instalación de Python disponible en su máquina.

Para un nuevo proyecto, PyCharm crea un entorno virtual aislado: venv, pipenv o Conda. Mientras trabaja, puede cambiarlo o crear nuevos intérpretes. También puede obtener una vista previa rápida de los paquetes instalados para sus intérpretes y agregar nuevos paquetes en la ventana de la herramienta Paquete de Python.


2 respuestas 2

Debe evitar el subproceso e implementar la funcionalidad de sed con Python en su lugar, p. Ej. con el módulo fileinput:

Con subprocess.call, cada argumento del comando debe ser un elemento separado en la lista (y el shell no debe establecerse en True):

O, todo el comando debe ser una cadena, con shell = True:

Los argumentos se tratan de manera similar para subprocess.call y Popen, y como la documentación para subprocess.Popen dice:

En Unix con shell = True, el shell por defecto es / bin / sh. … Si args es una secuencia, el primer elemento especifica la cadena de comando y cualquier elemento adicional se tratará como argumentos adicionales al propio shell. Es decir, Popen hace el equivalente de:


Crea los proyectos centrales de C ++

Siga las instrucciones de esta sección para crear dos proyectos C ++ idénticos, superfastcode y superfastcode2. Más adelante, usará un enfoque diferente en cada proyecto para exponer el código C ++ a Python.

En Explorador de la solución, haga clic con el botón derecho en la solución y luego seleccione Agregar & gt Nuevo proyecto. Una solución de Visual Studio puede contener proyectos de Python y C ++, que es una de las ventajas de usar Visual Studio para Python.

Busca en C ++, Seleccione Proyecto vacío, especifique ya sea superfastcode para el primer proyecto o superfastcode2 para el segundo proyecto y luego seleccione OK.

Alternativamente, con las herramientas de desarrollo nativas de Python instaladas en Visual Studio, puede comenzar con la plantilla del módulo de extensión de Python. La plantilla ya tiene mucho de lo que se describe aquí.

Sin embargo, para este tutorial, comenzar con un proyecto vacío demuestra la construcción del módulo de extensión paso a paso. Una vez que comprenda el proceso, puede usar la plantilla para ahorrar tiempo al escribir sus propias extensiones.

Para crear un archivo C ++ en el nuevo proyecto, haga clic con el botón derecho en el Archivos fuente nodo y luego seleccione Agregar & gt Nuevo artículo.

Seleccione Archivo C ++, nombralo module.cppy luego seleccione OK.

Un archivo con el .cpp La extensión es necesaria para activar las páginas de propiedades de C ++ en los pasos siguientes.

En la barra de herramientas principal, use el menú desplegable para realizar una de las siguientes acciones:

  • Para un tiempo de ejecución de Python de 64 bits, active el x64 configuración.
  • Para un tiempo de ejecución de Python de 32 bits, active el Win32 configuración.

En Explorador de la solución, haga clic con el botón derecho en el proyecto C ++, seleccione Propiedadesy luego haga lo siguiente:

un. Para Configuración, ingresar Activo (depuración).
B. Para Plataforma, ingrese ya sea Activo (x64) o Activo (Win32), dependiendo de su selección en el paso anterior.

Cuando cree sus propios proyectos, querrá configurar tanto el depurar y liberar configuraciones. En esta unidad, está configurando solo la configuración de depuración y configurándola para usar una versión de lanzamiento de CPython. Esta configuración deshabilita algunas funciones de depuración del tiempo de ejecución de C ++, incluidas las afirmaciones. Uso de binarios de depuración de CPython (python_d.exe) requiere diferentes configuraciones.

Establezca las propiedades como se describe en la siguiente tabla:

Pestaña Propiedad Valor
General Nombre de destino Especifique el nombre del módulo para hacer referencia a él desde Python en. declaraciones de importación. Utiliza este mismo nombre en el código C ++ cuando define el módulo para Python. Para usar el nombre del proyecto como el nombre del módulo, deje el valor predeterminado de

Pruebe el código y compare los resultados

Ahora que tiene las DLL estructuradas como extensiones de Python, puede consultarlas desde el proyecto de Python, importar los módulos y usar sus métodos.

Hacer que la DLL esté disponible para Python

Puede hacer que la DLL esté disponible para Python de varias formas. Aquí hay dos enfoques a considerar:

Este primer método funciona si el proyecto Python y el proyecto C ++ están en la misma solución. Haz lo siguiente:

En Explorador de la solución, haga clic con el botón derecho en el Referencias nodo en su proyecto de Python, y luego seleccione Añadir referencia.

En el cuadro de diálogo que aparece, seleccione el Proyectos pestaña, seleccione la superrápido y superfastcode2 proyectos y luego seleccione OK.

Un método alternativo instala el módulo en su entorno de Python, lo que hace que el módulo también esté disponible para otros proyectos de Python. Para obtener más información, consulte el herramientas de configuración documentación del proyecto. Haz lo siguiente:

Crea un archivo llamado setup.py en el proyecto C ++ haciendo clic derecho en el proyecto y seleccionando Agregar & gt Nuevo artículo.

Seleccione Archivo C ++ (.cpp), nombre el archivo setup.pyy luego seleccione OK.

Nombrar el archivo con el .py hace que Visual Studio lo reconozca como un archivo Python a pesar del uso de la plantilla de archivo C ++.

Cuando el archivo aparezca en el editor, pegue el siguiente código en él, según corresponda al método de extensión:

Para extensiones CPython (proyecto superfastcode):

Para PyBind11 (proyecto superfastcode2):

Crea un segundo archivo llamado pyproject.toml en el proyecto C ++ y pegue el siguiente código en él:

Para crear la extensión, haga clic con el botón derecho en el pyproject.toml pestaña, y luego seleccione Copiar ruta completa. Eliminarás el pyproject.toml nombre de la ruta antes de usarlo.

En Explorador de la solución, haga clic con el botón derecho en el entorno Python activo y luego seleccione Administrar paquetes de Python.

Si ya instaló el paquete, lo verá en la lista aquí. Antes de continuar, haga clic en el X para desinstalarlo.

En el cuadro de búsqueda, pegue la ruta copiada, elimine pyproject.toml desde el final, y luego seleccione Enter para instalar el módulo desde ese directorio.

Si la instalación falla debido a un error de permiso, agregue --usuario hasta el final y vuelva a intentar el comando.

Llamar a la DLL desde Python

Una vez que haya puesto la DLL a disposición de Python, como se describe en la sección anterior, puede llamar a las funciones superfastcode.fast_tanh y superfastcode2.fast_tanh2 desde el código de Python y comparar su rendimiento con la implementación de Python. Para llamar a la DLL, haga lo siguiente:

Agregue las siguientes líneas en su .py file para llamar a los métodos que se exportaron desde las DLL y mostrar sus resultados:

Ejecute el programa Python seleccionando Depurar & gt Empezar sin depurar o seleccionando Ctrl + F5.

Si el Empezar sin depurar el comando está deshabilitado, en Explorador de la solución, haga clic con el botón derecho en el proyecto Python y luego seleccione Establecer como proyecto de inicio.

Observe que las rutinas de C ++ se ejecutan aproximadamente de cinco a veinte veces más rápido que la implementación de Python. La salida típica aparece de la siguiente manera:

Intente aumentar la variable COUNT para que las diferencias sean más pronunciadas.

A depurar La compilación del módulo C ++ también se ejecuta más lento que un liberar build, porque la versión de depuración está menos optimizada y contiene varias comprobaciones de errores. No dude en cambiar entre esas configuraciones para compararlas, pero recuerde volver atrás y actualizar las propiedades que estableció anteriormente para la configuración de la versión.

En el resultado, puede ver que la extensión PyBind11 no es tan rápida como la extensión CPython, aunque debería ser significativamente más rápida que la implementación pura de Python. Esta diferencia se debe en gran parte a que usó la llamada METH_O, que no admite múltiples parámetros, nombres de parámetros o argumentos de palabras clave. PyBind11 genera un código un poco más complejo para proporcionar una interfaz más similar a Python a las personas que llaman. Pero, debido a que el código de prueba llama a la función 500.000 veces, ¡los resultados podrían amplificar en gran medida esa sobrecarga!

Puede reducir aún más la sobrecarga moviendo el bucle for al código nativo. Este enfoque implicaría usar el protocolo iterador (o el tipo PyBind11 py :: iterable para el parámetro de función) para procesar cada elemento. Eliminar las transiciones repetidas entre Python y C ++ es una forma eficaz de reducir el tiempo que lleva procesar la secuencia.

Solucionar problemas de importación de errores

Si recibe un mensaje ImportError cuando intenta importar su módulo, puede resolverlo de una de las siguientes maneras:

Cuando esté compilando a través de una referencia de proyecto, asegúrese de que las propiedades de su proyecto de C ++ coincidan con el entorno de Python que está activado para su proyecto de Python, especialmente el Incluir y Biblioteca directorios.

Asegúrese de que su archivo de salida tenga un nombre superfastcode.pyd. Cualquier otro nombre o extensión evitará que se importe.

Si instaló su módulo utilizando el setup.py archivo, verifique que haya ejecutado el pepita comando en el entorno de Python que está activado para su proyecto de Python. La expansión del entorno de Python en el Explorador de soluciones debería mostrar una entrada para superfastcode.

ltProjectName & gt
. Para python_d.exe, agregue _d al final del nombre.
Tipo de configuración Biblioteca dinámica (.dll)
Avanzado & gt Extensión de archivo de destino .pyd
Valores predeterminados del proyecto & gt Tipo de configuración Biblioteca dinámica (.dll)
C / C ++ & gt General Directorios de inclusión adicionales Agregar el Python incluir carpeta según corresponda para su instalación (por ejemplo, c: Python36 include).
C / C ++ & gt Preprocesador Definiciones de preprocesador Si está presente, cambie el _DEPURAR valor para NDEBUG para que coincida con la versión no depurada de CPython. Cuando estas usando python_d.exe, deje este valor sin cambios.
C / C ++ & gt Codigo de GENERACION Biblioteca de ejecución DLL de subprocesos múltiples (/ MD) para que coincida con la versión no depurada de CPython. Cuando estas usando python_d.exe, deje este valor como DLL de depuración multiproceso (/ MDd).
Enlazador & gt General Directorios de bibliotecas adicionales Agregar el Python libs carpeta que contiene .lib archivos, según corresponda para su instalación (por ejemplo, c: Python36 libs). Asegúrese de señalar el libs carpeta que contiene .lib archivos, y no la Lib carpeta que contiene .py archivos.
Pestaña Propiedad Valor
General General & gt Nombre de destino Especifique el nombre del módulo para hacer referencia a él desde Python en. declaraciones de importación. Utiliza este mismo nombre en el código C ++ cuando define el módulo para Python. Para usar el nombre del proyecto como el nombre del módulo, deje el valor predeterminado de

Aproximaciones alternativas

Puede crear extensiones de Python de varias formas, como se describe en la siguiente tabla. Las dos primeras filas, CPython y PyBind11, se analizan en este artículo.

Acercarse Clásico Usuarios representativos
Módulos de extensión C / C ++ para CPython 1991 Biblioteca estándar
PyBind11 (recomendado para C ++) 2015
Cython (recomendado para C) 2007 gevent, kivy
HPy 2019
mypyc 2017
ctypes 2003 oscrypto
cffi 2013 criptografía, pypy
TRAGO 1996 crfsuite
Boost.Python 2002
cppyy 2017

ltProjectName & gt
. Para python_d.exe, agregue _d al final del nombre.
General & gt Extensión de destino .pyd
Valores predeterminados del proyecto & gt Tipo de configuración Biblioteca dinámica (.dll)
C / C ++ & gt General Directorios de inclusión adicionales Agregar el Python incluir carpeta, según corresponda para su instalación (por ejemplo, c: Python36 include).
C / C ++ & gt Preprocesador Definiciones de preprocesador Si está presente, cambie el _DEPURAR valor para NDEBUG para que coincida con la versión no depurada de CPython. Cuando esté usando python_d.exe, deje este valor sin cambios.
C / C ++ & gt Codigo de GENERACION Biblioteca de ejecución DLL de subprocesos múltiples (/ MD) para que coincida con la versión no depurada de CPython. Cuando esté usando python_d.exe, deje este valor sin cambios.
Enlazador & gt General Directorios de bibliotecas adicionales Agregar el Python libs carpeta que contiene .lib archivos, según corresponda para su instalación (por ejemplo, c: Python36 libs). Asegúrese de señalar el libs carpeta que contiene .lib archivos, y no la Lib carpeta que contiene .py archivos.

Si el C / C ++ La pestaña no se muestra en las propiedades del proyecto, el proyecto no contiene archivos que identifique como archivos de origen C / C ++. Esta condición puede ocurrir si crea un archivo fuente sin un .C o .cpp extensión de archivo.

Por ejemplo, si ingresó accidentalmente module.coo en lugar de module.cpp anteriormente en el cuadro de diálogo de nuevo elemento, Visual Studio crea el archivo pero no establece el tipo de archivo en Código C / C +, que activa la pestaña de propiedades de C / C ++. Tal identificación errónea permanece incluso si cambia el nombre del archivo con un .cpp extensión de archivo.

Para configurar el tipo de archivo correctamente, en Explorador de la solución, haga clic con el botón derecho en el archivo y seleccione Propiedades. Entonces para Tipo de archivo, Seleccione Código C / C ++.

Para probar sus configuraciones (tanto depurar y liberar), haga clic con el botón derecho en el proyecto C ++ y luego seleccione Construir.

Encontrarás el .pyd archivos en el solución carpeta, debajo Depurar y Liberar, no en la propia carpeta del proyecto C ++.

En el proyecto C ++ module.cpp archivo, agregue el siguiente código:

Vuelva a compilar el proyecto C ++ para confirmar que su código es correcto.

Si aún no lo ha hecho, repita los pasos anteriores para crear un segundo proyecto llamado superfastcode2 con una configuración idéntica.


Construyendo PySide

1.2.4 (2015-10-14)

Lista completa de cambios y correcciones de errores

Configuración de PySide

1.2.3 (2015-10-12)

Lista completa de cambios y correcciones de errores

PySide

Shiboken

  • No ignore las clases de topología
  • Procesar enumeraciones globales en orden de declaración
  • Devolver enumeraciones en orden de declaración (orden agregada)

Configuración de PySide

1.2.2 (2014-04-24)

Lista completa de cambios y correcciones de errores

PySide

  • Arreglar PYSIDE-190: QCoreApplication se interbloquearía al salir si el QThreadPool.globalInstance () global está ejecutando un QRunnable con código Python
  • Cambie GlobalReceiver para "usar" [dis] connectNotify explícitamente de la clase base para evitar ocultarlos con sus propias sobrecargas.
  • Agregue conversiones explícitas al inicializar un int [] usando <>, como lo requiere C ++ 11 para estar "bien formado"
  • Arreglar PYSIDE-172: múltiples reglas para el archivo
  • Utilice la codificación del sistema de archivos en lugar del supuesto "ascii" al registrar qt.conf en el sistema de recursos Qt

Shiboken

  • Elimina las líneas de rechazo que hacen que falle la prueba sample_list
  • Retirar protegido de la prueba de encuadernación
  • Agregar análisis de la palabra clave "noexcept"
  • Corregir rechazos de funciones (es decir, sobrecargas de soporte)
  • Arreglar la construcción con Python 3.3 y 3.4
  • Doc: deje de requerir sphinx.ext.refcounting con Sphinx 1.2+
  • Corrección para contenedores con valores "const"
  • Solucionar problema de compilación en OS X 10.9
  • Solo use campos en PyTypeObject al definir tipos
  • Corregir definiciones de macro de procesamiento de saturación de búfer
  • Arreglar "especial" incluye manejo
  • Arreglar la búsqueda de clases base de contenedores
  • Refactorizar y mejorar la resolución de funciones agregadas
  • Solucione el & ltcmath & gt deficiente de MSVC en libsample / transform.cpp
  • Corregir la descripción de la prueba unitaria de muestra / transformación
  • Cambiar el ajuste y la sangría de algún código en Handler :: startElement para mejorar la coherencia
  • Se corrigió la sustitución de "% #" para # & gt 9
  • Mejorar las dependencias para las pruebas

1.2.1 (2013-08-16)

Cambios principales

PySide

Shiboken

  • Mejor soporte para más de 9 argumentos a métodos.
  • Evitar un error de segmentación al obtener el atributo .name en un valor de enumeración sin nombre

Configuración de PySide

  • Se cambió a las nuevas herramientas de configuración (v0.9.8) que se fusionaron con Distribute nuevamente y funcionan para Python 2 y 3 con una base de código.
  • Compatibilidad con la creación de archivos binarios de Windows con solo el SDK de Windows instalado (ya no se requiere Visual Studio)
  • Se eliminó la opción –msvc-version. La versión requerida del compilador de msvc ahora se resuelve a partir de la versión del intérprete de Python

1.2.0 (2013-07-02)

Cambios principales

PySide
  • Corrija múltiples segfaults y realice un mejor seguimiento de la vida útil de los objetos Qt
  • Reparar múltiples fugas de memoria
Shiboken
Configuración de PySide
  • En el sistema Windows, al instalar la distribución binaria PySide a través de easy_install, ya no es necesario llamar al script posterior a la instalación
  • Compatibilidad con la creación de archivos binarios de Windows fuera del símbolo del sistema de Visual Studio
  • Compile y empaquete los documentos shiboken cuando se instale sphinx

Lista completa de cambios y correcciones de errores

PySide
  • Configure PYTHONPATH para las pruebas correctamente
  • Corregir la posible falla de segmentación en el apagado
  • Arreglar PYSIDE-61
  • Dígale a Qt que busque importaciones de qml en el paquete PySide
  • arreglar compilación en modo C ++ 11
  • Arreglar la pérdida de memoria de QByteArray
  • Ignore los errores de importación de QtCore al inicializar la carpeta de complementos
  • Cargue previamente las DLL de OpenSSL en Windows.
  • Busque primero en el paquete PySide la carpeta de complementos de Qt, en lugar de solo en la carpeta de instalación o compilación de Qt
  • Agregue conversión de tipo explícita para corregir el error de compilación de mingw
  • Utilice la propiedad QObject para invalidar el contenedor antes de la eliminación
  • Invalidar el contenedor metaObject antes de la eliminación
  • Se corrigió la fuga de referencia en la conversión de un tipo de mapa C ++ a un dictado de Python
  • Cambie el orden de los directorios pysitetest y señales porque señales / desconectar_prueba.py depende del módulo pysidetest
Shiboken
  • Se eliminaron los logotipos antiguos de los documentos html.
  • Agregar retorno faltante en el error de inicio del módulo
  • No rompa -Werror = non-virtual-dtor
  • Prueba de corrección de shiboken para una prueba de unión mínima
  • Decref referencia al objeto de tipo
  • Corregir segfault al usar shiboken.delete
  • Use def de método no estático para métodos de instancia
  • Se corrigió el error introducido cuando se agregó recursive_invalidate
  • arreglar compilación en modo C ++ 11
  • Evitar la recursividad infinita en invalidar
  • Solucionar un posible conflicto con el recolector de basura
  • Solucionar un posible bloqueo en la salida
  • Arregle el manejo de unsigned long long y proporcione pruebas unitarias
  • Agregar prueba para ilustrar el problema en typedef enum
  • Use getWrapperForQObject para convertir si genera para PySide
  • Permitir la compilación sin una biblioteca compartida de Python
  • Usa el metaObjeto de la clase principal si el contenedor es NULL
  • Opcionalmente, afirmar en el puntero libre con un contenedor válido
  • Encuentre bibliotecas de python3 cuando se compile con pydebug habilitado
  • Corregir el error PYSIDE-108 y agregar un ejemplo
  • PYSIDE-83 Se corrigió el error de segmentación llamando a shiboken.dump
  • Arregle y pruebe el caso para el error PYSIDE-72
  • Anula todas las funciones con el mismo nombre, no solo una
  • Actualizar la conversión de vectores
  • Agregar ejemplos de typedef a minimal
  • Agregar archivos de prueba de nuevo a cmake
  • No lo use- & gtsegundo después de borrarlo
  • Encuentre modificaciones de funciones definidas en la segunda clase básica. Corrige el error PYSIDE-54.
  • Establezca una función hash predeterminada para todos los ObjectTypes. Se corrigió el error PYSIDE-42.
  • Corrija la compilación cuando no hay libxslt instalado en el sistema.
  • Resolución fija de SOABI. SOABI se implementa en Linux, pero no en Windows
  • No use métodos en línea en clases dllexported para mantener feliz a VC ++
  • El uso de SpooledTemporaryFile en 2.6+ os.tmpfile () falla en win32 si el proceso no tiene permisos de administrador
Configuración de PySide
  • Compatibilidad con la creación de archivos binarios de Windows fuera del símbolo del sistema de Visual Studio
  • Compile y empaquete los documentos shiboken cuando se instale sphinx
  • Soporta Ubuntu 13.04 y Fedora 18
  • Se corrigió el comando "desarrollar" setuptools
  • Actualizaciones de documentación
  • Agregue la opción –build-tests para habilitar la construcción de las pruebas
  • Agregue las opciones –jom y –jobs
  • Agregue la opción –no-examples para excluir los ejemplos
  • Agregue la opción –relwithdebinfo para habilitar un modo de compilación de lanzamiento con información de depuración
  • Agregar la opción –ignore-git
  • Agregue la opción –make-spec para especificar el generador de make

1.1.2 (2012-08-28)

Corrección de errores

  • Durante la emisión de la señal, no obtenga el tipo de retorno después de la devolución de llamada.
  • Invalidar QStandardModel :: invisibleRootItem en el método clear ()
  • QAbstractItemModel tiene una política de propiedad incorrecta para selectionModel ()
  • Conversión mejorada de QVector a Python
  • Inhabilite la generación de cadenas de documentos si no se encuentran las herramientas.
  • Se corrigieron algunos problemas al compilar PySide usando VC ++
  • Instale el módulo shiboken en paquetes de sitio
  • Corrija la compilación cuando no hay libxslt instalado en el sistema.
  • Establezca una función hash predeterminada para todos los ObjectTypes.
  • Arreglar segfault llamando a shiboken.dump

1.1.1 (2012-04-19)

Cambios principales

  • Cadena de herramientas unificada! No más GeneratorRunner y ApiExtractor, ahora solo necesita Shiboken para compilar PySide.

Corrección de errores

  • 1105 Spyder falla con HEAD
  • 1126 Segfault cuando se genera una excepción en signalInstanceDisconnect
  • 1135 SIGSEGV al cargar un widget personalizado usando QUiLoader al anular createWidget ()
  • 1041 QAbstractItemModel tiene una política de propiedad incorrecta para selectionModel ()
  • 1086 generador de errores segmentados #include
  • 1110 El error de simultaneidad provoca daños en el montón de GC
  • 1113 La instanciación de QObject en el constructor del elemento QML definido por el usuario se bloquea si se crea una instancia desde QML
  • 1129 Fallo de segmentación al cerrar por QStandardItem / QStandardItemModel
  • 1104 QSettings tiene problemas con enteros largos
  • 1108 tests / QtGui / pyside_reload_test.py falla cuando la escritura de bytecode está deshabilitada
  • 1138 La subclasificación de QUiLoader conduce a la excepción "Objeto C ++ interno ya eliminado" (nuevamente)
  • 1124 QPainter.drawPixmapFragments debe tomar una lista como primer argumento
  • 1065 Ejemplo no válido en la documentación de QFileDialog
  • 1092 shiboken se autodenomina "generador"
  • 1094 shiboken no se queja de opciones no válidas
  • 1044 llamada incorrecta al constructor principal en el ejemplo
  • 1139 Crash en la salida debido a que el estado del hilo (tstate) es NULL
  • PYSIDE-41 QModelIndex unhashable

1.1.0 (2012-01-02)

Cambios principales

Corrección de errores

  • Parche 1010 Shiboken Cygwin
  • 1034 Error al compilar PySide con Python 3.2.2 32bit en Windows
  • 1040 atributos de sobrescritura de pyside-uic antes de que se utilicen
  • 1053 pyside-lupdate usado con archivos .pro no puede manejar rutas de Windows que contienen espacios
  • 1060 La subclasificación de QUiLoader conduce a la excepción "Objeto interno de C ++ ya eliminado"
  • 1063 Error al escribir en archivos usando "QTextStream + QFile + QTextEdit" en Linux
  • 1069 QtCore.QDataStream falla silenciosamente al escribir una cadena de Python
  • 1077 Bloqueo de salida de la aplicación cuando se llama a QSyntaxHighlighter.document ()
  • 1082 enlaces binarios de OSX están rotos
  • 1083 winId devuelve un PyCObject que hace imposible comparar dos winIds
  • 1084 Crash (segfault) al escribir una cadena Unicode en el socket
  • 1091 PixmapFragment y drawPixmapFragments no están enlazados
  • 1095 No hay ejemplos para el tutorial de shiboken
  • 1097 QtGui.QShortcut.setKey requiere QKeySequence
  • 1101 Informar firmas de funciones no válidas en typeystem
  • 902 Exponer la funcionalidad de Shiboken a través de un módulo de Python
  • 969 viewOptions del error QAbstractItemView

1.0.9 (2011-11-29)

Corrección de errores

  • 1058 Código extraño en PySide / QtUiTools / glue / plugins.h
  • 1057 valgrind detectado "El salto o movimiento condicional depende del valor no inicializado"
  • 1052 PySideConfig.cmake contiene un bucle infinito debido a que falta el valor predeterminado para SHIBOKEN_PYTHON_SUFFIX
  • 1048 QGridLayout.itemAtPosition () se bloquea cuando debería devolver None
  • 1037 shiboken no se puede compilar contra python 3.2 (tanto normal como -dbg) en i386 (y otros)
  • 1036 Qt.KeyboardModifiers siempre se evalúa a cero
  • 1033 instancias de QDialog.DialogCode y valor de retorno de QDialog.exec_ hash a diferentes valores
  • 1031 QState.parentState () o QState.machine () provoca un bloqueo de Python al salir
  • 1029 qmlRegisterType no puede aumentar el recuento de referencias
  • 1028 Falta QWidget winId
  • 1016 La llamada del método Q_INVOKABLE que no devuelve QVariant es imposible ...
  • 1013 conectarse a QSqlTableModel.primeInsert () causa bloqueo
  • 1012 FTBFS con indicadores de endurecimiento habilitados
  • Parche 1011 PySide Cygwin
  • Parche 1010 Shiboken Cygwin
  • Parche 1009 GeneratorRunner Cygwin
  • Parche 1008 ApiExtractor Cygwin
  • 891 ApiExtractor no admite doxygen como backend para la generación de documentos.

1.0.8 (2011-10-21)

Cambios principales

Corrección de errores

  • 1022 RuntimeError: se superó la profundidad de recursividad máxima al obtener la cadena de un objeto
  • 1019 La anulación de QWidget.show o QWidget.hide no funciona
  • 944 Segfault en QIcon (Ninguno) .pixmap ()

1.0.7 (2011-09-21)

Corrección de errores

  • 996 Faltan dependencias para QtWebKit en scripts de compilación para Fedora
  • 986 enlaces de documentación
  • 985 Proporcionar un archivo zip versionado pyside-docs para ayudar a los empaquetadores
  • 981 Los documentos de QSettings deberían empatizar los cambios de comportamiento de value () en diferentes plataformas
  • 902 Exponer la funcionalidad de Shiboken a través de un módulo de Python
  • 997 QDeclarativePropertyMap no funciona.
  • 994 QIODevice.readData debe usar qmemcpy en lugar de qstrncpy
  • 989 Falla el decapado QColor
  • 987 Desconectar una señal que no ha sido conectada
  • 973 shouldInterrupt La anulación de la ranura de JavaScript nunca se llama
  • 966 QX11Info.display () falta
  • 959 no puede pasar QVariant al puente QtWebkit
  • 1006 Segfault en QLabel init
  • 1002 Fallo de segmentación en la salida de PySide / Spyder
  • 998 Segfault con Spyder después de cambiar a otra aplicación
  • 995 QDeclarativeView.itemAt devuelve una referencia defectuosa. (que conduce a SEGFAULT)
  • 990 Segfault al intentar desconectar una señal que no está conectada
  • 975 Posible fuga de memoria
  • 991 El __repr__ de varios tipos está roto
  • 988 El tipo suministrado con la señal currentChanged en QTabWidget ha cambiado en 1.0.6

1.0.6 (2011-08-22)

Cambios principales

  • Nuevo diseño de documentación
  • Se corrigieron algunas regresiones de la última versión (1.0.5)
  • Optimizaciones durante la conexión anónima

Corrección de errores

  • 972 anchorlayout.py del ejemplo de graphicsview generó una excepción de memoria que no se puede escribir cuando sale
  • 953 Segfault cuando QObject es basura recolectada después de QTimer.singeShot
  • 951 ComponentComplete no llamado en la subclase QDeclarativeItem
  • 965 Segfault en QtUiTools.QUiLoader.load
  • 958 Fallo de segmentación con archivos de recursos
  • 944 Segfault en QIcon (Ninguno) .pixmap ()
  • 941 Señales con tipos QtCore.Qt como argumentos tienen firmas inválidas
  • 964 Falta el método QAbstractItemView.moveCursor ()
  • 963 What’s This no muestra la información del encabezado de la columna QTableWidget como en Qt Designer
  • 961 QColor .__ repr __ / __ str__ debería ser más pitónico
  • 960 QColor .__ reduce__ es incorrecto para colores HSL
  • 950 implemento Q_INVOKABLE
  • 940 setAttributeArray / setUniformValueArray no aceptan matrices
  • 931 isinstance () falla con instancias de Signal
  • 928 cientos de QGraphicItems con conexiones de señal provocan ralentización
  • La documentación 930 mezcla señales y funciones.
  • 923 Hacer que QScriptValue (o QScriptValueIterator) implemente el protocolo de iterador de Python
  • 922 El repr () de QScriptValue debería dar alguna información sobre sus datos
  • 900 QtCore.Property como decorador
  • La versión 895 de jQuery está desactualizada, la deduplicación del código de distribución rompe la búsqueda de documentación
  • 731 No se puede especificar más de un argumento "desde"
  • 983 copy.deepcopy genera SystemError con QColor
  • 947 NETWORK_ERR durante la interacción de la ventana QtWebKit con el servidor
  • 873 Los métodos obsoletos podrían emitir DeprecationWarning
  • 831 documentos de PySide tendrían una lista "Heredado por" para cada clase

1.0.5 (2011-07-22)

Cambios principales

  • Los widgets presentes en los archivos "ui" se exportan en el widget raíz, consulte el hilo de PySide ML para obtener más información [1]
  • pyside-uic genera barras de menú sin padre en la plataforma MacOS
  • Optimizaciones de conexión de señal

Corrección de errores

  • 892 Segfault al destruir QWidget y QApplication tiene un filtro de eventos instalado
  • 407 Crash durante la herencia múltiple con QObject y la clase Python nativa
  • 939 Shiboken :: importModule debe verificar si PyImport_ImportModule tiene éxito
  • 937 falta el método pid en QProcess
  • 927 Segfault en el código QThread.
  • 925 Segfault al pasar un QScriptValue como QObject o al usar .toVariant () en un QScriptValue
  • 905 QtGui.QHBoxLayout.setMargin La llamada a la función es creada por pyside-uic, pero esto no está disponible en los enlaces de pyside
  • 904 Abrir repetidamente un QDialog con el conjunto Qt.WA_DeleteOnClose bloquea PySide
  • 899 Segfault con la propiedad "QVariantList".
  • 893 Referencia de fuga de Shiboken en el control principal
  • 878 Shiboken puede generar módulos incompatibles si se agrega una nueva clase.
  • 938 QTemporaryFile Problema de JPEG
  • 934 Un __getitem__ de QByteArray se comporta de forma extraña
  • 929 archivos pkg-config no conocen las etiquetas de la versión de Python
  • 926 qmlRegisterType no funciona con QObject
  • 924 Permitir que se acceda a QScriptValue a través de []
  • 921 Señales que no se desconectan automáticamente al destruir un objeto
  • 920 No se puede utilizar la misma ranura para dos señales
  • 919 Los argumentos predeterminados en los métodos QStyle no funcionan
  • 915 QDeclarativeView.scene (). AddItem (x) invalida el objeto x
  • 913 Los widgets dentro de QTabWidget no se exportan como miembros del widget que los contiene
  • 910 installEventFilter () incrementa el recuento de referencias en el objeto de destino
  • 907 pyside-uic agrega MainWindow.setMenuBar (self.menubar) al código generado en OS X
  • 903 eventFilter en ItemDelegate
  • 897 Los métodos QObject.property () y QObject.setProperty () fallan para las propiedades definidas por el usuario
  • 896 Falta QObject.staticMetaObject ()
  • 916 Falta información sobre cuándo es posible usar argumentos de palabras clave en documentos [era: el constructor de QListWidgetItem ignora el parámetro de texto]
  • 890 Agregar ejemplo de conexión de señal para valueChanged (int) en QSpinBox a los documentos
  • 821 Interfaz de mapeo para QPixmapCache
  • 909 La eliminación de QMainWindow / QApplication provoca un error de segmentación

Reúna sus materiales

Primero, debe recopilar lo que necesita para realizar la instalación. Haremos todo nuestro trabajo en $ HOME / local / src. Debería crear este directorio ahora.

A continuación, necesitaremos descargar el código fuente del paquete que queremos instalar. En nuestro ejemplo, usaremos "NumExpr", un paquete que ya proporcionamos en la versión del sistema de Python. Puede descargar el archivo a su escritorio y luego cargarlo en OSC, o descargarlo directamente usando la utilidad wget (si conoce la URL del archivo).

A continuación, extraiga el archivo descargado. En este caso, dado que es un formato "tar.gz", podemos usar tar para descomprimir y extraer el contenido.

Puede eliminar el archivo descargado ahora o conservarlo si desea comenzar la instalación desde cero.


6 respuestas 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 respuestas 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. Lea la parte sobre colores porque son diferentes, aunque no mucho. 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() . Para ser honesto, no he encontrado una explicación de esta elección de diseño.

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.