Más

QGIS: los errores de Python no se informan a la consola de Python

QGIS: los errores de Python no se informan a la consola de Python


He estado escribiendo una serie de pequeños complementos para usar en QGIS, y he descubierto que durante el desarrollo, tener las llamadas de rastreo informando al complemento de la consola de Python es bastante útil.

Utilizo QGIS en tres máquinas, pero descubrí que ahora en dos de ellas, todos los errores / rastreos de Python pasan por el cuadro de diálogo de error genérico de Python; esto solo ocurre si hay un error al iniciar el complemento en la máquina que informa el rastreo a la consola de Python.

¿Alguien sabe cómo puedo volver a configurar el comportamiento para informar a la consola de Python en lugar del cuadro de diálogo?


Intente poner:

sys.excepthook = sys .__ excepthook__

al comienzo de tu guión


Mdhntd

¿Es el interior de una bolsa de tenencia en realidad un espacio extradimensional?

Atar doble nudo de bolsa de basura

¿Es arriesgado pasar de una amplia diversificación geográfica a invertir principalmente en mercados menos desarrollados?

¿Cómo deciden los hablantes de alemán qué debe estar en el lado izquierdo del verbo?

El profesor se niega a escribir una carta de recomendación a los estudiantes que no han escrito un trabajo de investigación con él

'El trabajo duro nunca hace daño a nadie' ¿Por qué no 'duele'?

FORMAT devuelve un tamaño de fila y de datos grandes

Argumento predeterminado para un functor en un parámetro con plantilla

¿En qué lugar de la Tierra es más fácil sobrevivir en la naturaleza?

¿Cómo hago más obvio mi ejercicio de llenar los espacios en blanco?

¿Cuál es el objetivo de esta macro?

MOSFET se rompió después de conectar el banco de condensadores

¿Por qué el Primer Ministro del Reino Unido necesita el permiso del Parlamento para convocar elecciones generales?

La presentación de la tesis de Life Post es aterradora - ¡Ayuda!

¿Alguna vez se resumió "El Hobbit"?

¿Cuál es la fuente del miedo en el efecto de miedo adicional del hechizo Hallow?

¿Es posible observar la basura espacial con binoculares?

¿Son el lenguaje y el pensamiento lo mismo?

¿Cuál es la excentricidad de una órbita (trayectoria) que cae directamente hacia el centro?

Nunca haga que los miembros públicos sean virtuales / abstractos, ¿de verdad?

La unión espacial de GeoPandas genera un error en la consola Python de QGIS 3.8

Error de Python ponderado por distancia inversa en QGIS 2.0 El complemento QuickFinder QGIS genera errores de Python Obteniendo un error al importar GeoPandas en la consola Python Depurar el complemento QGIS3 con Visual Studio Code

Quiero ejecutar una unión espacial usando GeoPandas en la consola Python QGIS 3.8 como esta:

pero no funciona. Siempre muestra el siguiente error:

Pero, si lo ejecuto en OSGeo4W Shell, se ejecuta correctamente de la siguiente manera:

¿Cuál es la diferencia entre la consola de Python en la aplicación QGIS y en OSGeo4W Shell?
¿Y cómo puedo solucionarlo?

el error se debe a rtree y no a GeoPandas (las Geopandas usan rtree)

Pero, funciona correctamente cuando lo intento en OSGEO4W Shell

Quiero ejecutar una unión espacial usando GeoPandas en la consola Python QGIS 3.8 como esta:

pero no funciona. Siempre muestra el siguiente error:

Pero, si lo ejecuto en OSGeo4W Shell, se ejecuta correctamente de la siguiente manera:

¿Cuál es la diferencia entre la consola de Python en la aplicación QGIS y en OSGeo4W Shell?
¿Y cómo puedo solucionarlo?

el error se debe a rtree y no a GeoPandas (las Geopandas usan rtree)

Pero, funciona correctamente cuando lo intento en OSGEO4W Shell

Quiero ejecutar una unión espacial usando GeoPandas en la consola Python QGIS 3.8 como esta:

pero no funciona. Siempre muestra el siguiente error:

Pero, si lo ejecuto en OSGeo4W Shell, se ejecuta correctamente de la siguiente manera:

¿Cuál es la diferencia entre la consola de Python en la aplicación QGIS y en OSGeo4W Shell?
¿Y cómo puedo solucionarlo?

Quiero ejecutar una unión espacial usando GeoPandas en la consola Python QGIS 3.8 como esta:

pero no funciona. Siempre muestra el siguiente error:

Pero, si lo ejecuto en OSGeo4W Shell, se ejecuta correctamente de la siguiente manera:

¿Cuál es la diferencia entre la consola de Python en la aplicación QGIS y en OSGeo4W Shell?
¿Y cómo puedo solucionarlo?


Tic Tac Toe basado en texto de Python

Tener una clase para jugador parece demasiado complicado. Una simple tupla con nombre sería suficiente.

La función main () hace la mayor parte del trabajo pesado. Puede tener una clase de juego, que toma la lista de jugadores (u objetos individuales) como parámetros de inicio y luego implementa la lógica del juego.

Puede reutilizar get_player_input cuando solicite otro juego del usuario.

Cuando se trabaja con una biblioteca aleatoria, generalmente es una buena práctica sembrarla al principio.

La cámara de visualización Board.display se convertirá en una línea:

En lugar de tener un método Board.display, anule __str__ y simplemente imprima (tablero).

Implementación alternativa de is_full:

Ha perdido una oportunidad OO.

Tienes una clase Player pero todavía estás & quotswitching en datos internos & quot. Tu hiciste esto:

que no es un método en Player. Y luego, haces esto:

Este acto de escribir if player.is_human:. demás: . está & quotswitching en datos internos & quot. Son "datos internos" porque no los obtiene de fuera de la clase. Es & quotswitching & quot porque está haciendo una elección exclusiva.

Activar datos internos es un "olor a código" que indica que es posible que necesite una nueva clase. En este caso, creo que sí:

Sugeriré que el constructor IO tome flujos de entrada y salida, y maneje la visualización de la placa y solicite un nuevo movimiento.

También te sugeriré que escribas una clase TextIO de algún tipo, y le des métodos como & quot solicitar entrada & quot y & quot leer una cadena & quot y & quot leer un número entero & quot. Este conjunto básico de operaciones puede ser los componentes básicos de su clase PlayerIO y permitirá crear un objeto simulado para las pruebas unitarias.


2 respuestas 2

1. Revisión

No se recomienda usar el espacio de nombres std; el problema es que esto importa todos los identificadores de std, y algunos de estos pueden ocultar nombres de otros módulos que necesita usar. Vea esta pregunta en Stack Overflow.

El código no comprueba el éxito / fracaso de muchas de las funciones que llama. Todos estos pueden fallar:

(y tal vez otros que no vi).

No hay Py_DECREF para pArgs.

Sería posible evitar la construcción de la tupla de argumentos utilizando PyObject_CallFunctionObjArgs en lugar de PyObject_CallObject.

Los mensajes de error deben escribirse en error estándar (cerr), no en salida estándar.

Es más claro usar las macros EXIT_SUCCESS y EXIT_FAILURE de & ltcstdlib & gt en lugar de 0 y 1.

El código llama a PyArray_NDIM y PyArray_SHAPE en np_ret sin verificar si este objeto es de hecho una matriz. Llame primero a PyArray_Check.

Usar la inicialización de valor para variables int me parece perverso. Con int i <> debe recordar que el constructor predeterminado le da a la variable el valor 0. Con int i = 0 no hay necesidad de recordar (y el código no es menos eficiente: el código compilado en realidad no crea un 0 temporal object y luego llame al constructor de asignación int).

Este código no proporciona tanta información sobre errores como podría. En particular, los errores dentro de Python hacen que Python cree un objeto de excepción que contiene información sobre el error (consulte "Manejo de excepciones"). Sería una buena idea imprimir este objeto, si existe, marcando PyErr_Occurred y luego llamando a PyErr_Print.

Cada bloque de código de manejo de errores tiene que deshacer el efecto de todos los bloques de código exitosos anteriores. Esto hace que la longitud de la función cuadrático en el número de casos de error! Esto es arriesgado, porque cada vez que cambia algo, debe ajustar todos los casos de error en consecuencia, y es muy fácil de olvidar (como en §1.3 anterior). Además, el dolor de escribir todo el código de manejo de errores hace que sea tentador omitir el manejo de errores para las funciones que cree que probablemente tendrán éxito (como en §1.2 anterior).

Consulte el código revisado a continuación para ver una forma de organizar que cada operación de "deshacer" aparezca una sola vez.


Algunos de nuestros clientes

Está creciendo rápido!

¡Buscamos expandir nuestra presencia en los EE. UU.!

Como Gerente de Desarrollo Comercial, usted:

  • expandir el negocio en los EE. UU.
  • reclutar talento local (ventas, agentes, formadores, consultores)
  • reclutar formadores y consultores locales

Ofrecemos:

  • Sistemas de inteligencia artificial y Big Data para respaldar su operación local
  • automatización de alta tecnología
  • contenido y catálogo de cursos continuamente actualizado
  • muy divertido en el equipo internacional

Si está interesado en ejecutar un negocio de consultoría y capacitación de alta tecnología y alta calidad.


Cada colección tiene hijos (colección) propiedad. Fácil de entender usando la consola de Python:

Para obtener el primer nivel de todas las subcolecciones, simplemente puede iterar a través de la lista:

Para agregar una nueva colección, cree un nuevo bloque de datos y luego use el método .link (colección) para agregarlo a lo que sea principal la colección es:

El mismo principio se aplica a todas las colecciones, sin importar si la colección está en el primer nivel o en cualquier otro. Ejemplo sobre cómo agregar un nuevo (sub) colección al activo colección:

También puede especificar cada colección por su nombre C.scene.collection.children ["Colección"] o incluso puede usar el operador de índice C.scene.collection.children [0] pero eso es propenso a errores. En caso de que cambie el nombre de la colección o la jerarquía de la escena, estás perdido. Una mejor práctica es usar el método get () de pitones para realizar básicamente una búsqueda de la colección en primer lugar:

Avanzado ejemplo sobre cómo agregar una nueva colección a una colección arbitraria en la escena usando un bucle recursivo basado en https://blender.stackexchange.com/a/137866:

Observe que agrega objetos a la (s) colección (s) de la misma manera simplemente pasando un objeto al llamar al método .link (objeto) en el objeto real (colección) propiedad, que en realidad es bastante agradable y conveniente:


Objetos FTP¶

Hay varios métodos disponibles en dos versiones: uno para manejar archivos de texto y otro para archivos binarios. Estos reciben el nombre del comando que se utiliza seguido de líneas para la versión de texto o binario para la versión binaria.

Las instancias FTP tienen los siguientes métodos:

FTP. set_debuglevel ( nivel ) ¶

Establece el nivel de depuración de la instancia. Esto controla la cantidad de salida de depuración impresa. El valor predeterminado, 0, no produce salida de depuración. Un valor de 1 produce una cantidad moderada de salida de depuración, generalmente una sola línea por solicitud. Un valor de 2 o más produce la cantidad máxima de salida de depuración, registrando cada línea enviada y recibida en la conexión de control.

FTP. conectar host = '', puerto = 0, timeout = Ninguno, source_address = Ninguno ) ¶

Conéctese al host y al puerto indicados. El número de puerto predeterminado es 21, según lo especificado por la especificación del protocolo FTP. Rara vez es necesario especificar un número de puerto diferente. Esta función debe llamarse solo una vez para cada instancia, no debe llamarse en absoluto si se proporcionó un host cuando se creó la instancia. Todos los demás métodos solo se pueden utilizar después de que se haya realizado una conexión. El opcional se acabó el tiempo El parámetro especifica un tiempo de espera en segundos para el intento de conexión. Si no se acabó el tiempo se pasa, se utilizará la configuración de tiempo de espera predeterminada global. Dirección de la fuente es una tupla de 2 (host, puerto) para que el socket se vincule como su dirección de origen antes de conectarse.

Genera un evento de auditoría ftplib.connect con argumentos self, host, port.

Modificado en la versión 3.3: Dirección de la fuente se agregó el parámetro.

Devuelve el mensaje de bienvenida enviado por el servidor en respuesta a la conexión inicial. (Este mensaje a veces contiene exenciones de responsabilidad o información de ayuda que puede ser relevante para el usuario).

Inicie sesión como dado usuario. El passwd y cuenta los parámetros son opcionales y predeterminados para la cadena vacía. Si no usuario se especifica, por defecto es 'anónimo'. Si usuario es 'anónimo', el valor predeterminado passwd es 'anónimo & # 64'. Esta función debe llamarse solo una vez para cada instancia, después de que se haya establecido una conexión, no debe llamarse en absoluto si se proporcionó un host y un usuario cuando se creó la instancia. La mayoría de los comandos FTP solo se permiten después de que el cliente haya iniciado sesión. cuenta parámetro proporciona "información contable" pocos sistemas implementan esto.

Abortar una transferencia de archivos en curso. Usar esto no siempre funciona, pero vale la pena intentarlo.

Envíe una cadena de comando simple al servidor y devuelva la cadena de respuesta.

Genera un evento de auditoría ftplib.sendcmd con argumentos self, cmd.

Envíe una cadena de comando simple al servidor y maneje la respuesta. No devuelve nada si se recibe un código de respuesta correspondiente al éxito (códigos en el rango 200-299). De lo contrario, aumente error_reply.

Genera un evento de auditoría ftplib.sendcmd con argumentos self, cmd.

FTP. retrbinary cmd, llamar de vuelta, tamaño de bloque = 8192, resto = Ninguno ) ¶

Recupere un archivo en modo de transferencia binaria. cmd debe ser un comando RETR apropiado: 'RETR filename'. El llamar de vuelta Se llama a la función para cada bloque de datos recibido, con un argumento de un solo byte que proporciona el bloque de datos. El opcional tamaño de bloque El argumento especifica el tamaño máximo de fragmento para leer en el objeto de socket de bajo nivel creado para realizar la transferencia real (que también será el tamaño más grande de los bloques de datos pasados ​​a llamar de vuelta). Se elige un valor predeterminado razonable. descanso significa lo mismo que en el método transfercmd ().

FTP. retrlines cmd, callback = Ninguno ) ¶

Recuperar una lista de archivos o directorios con la codificación especificada por codificacion parámetro en la inicialización. cmd debe ser un comando RETR apropiado (ver retrbinary ()) o un comando como LIST o NLST (generalmente solo la cadena 'LIST'). LIST recupera una lista de archivos e información sobre esos archivos. NLST recupera una lista de nombres de archivos. El llamar de vuelta Se llama a la función para cada línea con un argumento de cadena que contiene la línea con el CRLF final eliminado. El valor por defecto llamar de vuelta imprime la línea a sys.stdout.

Habilite el modo "pasivo" si val es verdadero; de lo contrario, desactive el modo pasivo. El modo pasivo está activado de forma predeterminada.

FTP. storbinary cmd, fp, tamaño de bloque = 8192, callback = Ninguno, resto = Ninguno ) ¶

Almacene un archivo en modo de transferencia binaria. cmd debe ser un comando de ALMACENAMIENTO apropiado: & quotSTOR nombre de archivo & quot. fp es un objeto de archivo (abierto en modo binario) que se lee hasta EOF usando su método read () en bloques de tamaño tamaño de bloque para proporcionar los datos que se almacenarán. El tamaño de bloque El argumento predeterminado es 8192. llamar de vuelta es un único parámetro opcional invocable que se llama en cada bloque de datos después de su envío. descanso significa lo mismo que en el método transfercmd ().

Modificado en la versión 3.2: descanso parámetro agregado.

Almacene un archivo en modo de línea. cmd debe ser un comando de ALMACENAMIENTO apropiado (ver storbinary ()). Las líneas se leen hasta EOF del objeto de archivo fp (abierto en modo binario) usando su método readline () para proporcionar los datos que se almacenarán. llamar de vuelta es un único parámetro opcional invocable que se llama en cada línea después de su envío.

FTP. transfercmd cmd, resto = Ninguno ) ¶

Inicie una transferencia a través de la conexión de datos. Si la transferencia está activa, envíe un comando EPRT o PORT y el comando de transferencia especificado por cmdy acepta la conexión. Si el servidor es pasivo, envíe un comando EPSV o PASV, conéctese e inicie el comando de transferencia. De cualquier manera, devuelva el zócalo para la conexión.

Si es opcional descanso se da, se envía un comando REST al servidor, pasando descanso como argumento. descanso suele ser un desplazamiento de bytes en el archivo solicitado, que le indica al servidor que reinicie el envío de los bytes del archivo en el desplazamiento solicitado, omitiendo los bytes iniciales. Sin embargo, tenga en cuenta que el método transfercmd () convierte descanso a una cuerda con el codificacion parámetro especificado en la inicialización, pero no se realiza ninguna verificación en el contenido de la cadena. Si el servidor no reconoce el comando REST, se generará una excepción error_reply. Si esto sucede, simplemente llame a transfercmd () sin un descanso argumento.

FTP. ntransfercmd ( cmd, resto = Ninguno ) ¶

Como transfercmd (), pero devuelve una tupla de la conexión de datos y el tamaño esperado de los datos. Si no se pudo calcular el tamaño esperado, se devolverá Ninguno como tamaño esperado. cmd y descanso significa lo mismo que en transfercmd ().

Enumere un directorio en un formato estandarizado usando el comando MLSD ( RFC 3659). Si sendero se omite se asume el directorio actual. hechos es una lista de cadenas que representan el tipo de información deseada (por ejemplo, [& quottype & quot, & quotsize & quot, & quotperm & quot]). Devuelve un objeto generador que produce una tupla de dos elementos por cada archivo encontrado en la ruta. El primer elemento es el nombre del archivo, el segundo es un diccionario que contiene datos sobre el nombre del archivo. El contenido de este diccionario puede estar limitado por hechos argumento, pero no se garantiza que el servidor devuelva todos los hechos solicitados.

Devuelve una lista de nombres de archivos tal como los devuelve el comando NLST. El opcional argumento es un directorio para listar (el predeterminado es el directorio del servidor actual). Se pueden utilizar varios argumentos para pasar opciones no estándar al comando NLST.

Si su servidor admite el comando, mlsd () ofrece una mejor API.

Genere una lista de directorios tal como la devuelve el comando LIST, imprimiéndola en la salida estándar. El opcional argumento es un directorio para listar (el predeterminado es el directorio del servidor actual). Se pueden usar varios argumentos para pasar opciones no estándar al comando LIST. Si el último argumento es una función, se utiliza como llamar de vuelta funciona como para retrlines () el valor predeterminado se imprime en sys.stdout. Este método devuelve Ninguno.

Si su servidor admite el comando, mlsd () ofrece una mejor API.

Renombrar archivo fromname en el servidor para nombrar.

Eliminar el archivo llamado nombre del archivo desde el servidor. Si tiene éxito, devuelve el texto de la respuesta; de lo contrario, genera error_perm en los errores de permiso o error_reply en otros errores.

Configure el directorio actual en el servidor.

Cree un nuevo directorio en el servidor.

Devuelve el nombre de la ruta del directorio actual en el servidor.

Eliminar el directorio llamado dirname en el servidor.

Solicite el tamaño del archivo nombrado nombre del archivo en el servidor. En caso de éxito, el tamaño del archivo se devuelve como un número entero; de lo contrario, se devuelve Ninguno. Tenga en cuenta que el comando SIZE no está estandarizado, pero es compatible con muchas implementaciones de servidor comunes.

Envíe un comando QUIT al servidor y cierre la conexión. Esta es la forma "educada" de cerrar una conexión, pero puede generar una excepción si el servidor responde con un error al comando QUIT. Esto implica una llamada al método close () que hace que la instancia FTP sea inútil para llamadas posteriores (ver más abajo).

Cierre la conexión unilateralmente. Esto no debe aplicarse a una conexión ya cerrada, como después de una llamada exitosa a quit (). Después de esta llamada, la instancia de FTP no debe usarse más (después de una llamada a close () o quit () no puede volver a abrir la conexión emitiendo otro método login ()).


Asegúrese de que realmente necesita ejecutar su tarea repetidamente. Esto se denomina espera ocupada y casi siempre es subóptima. Si su tarea es verificar la salida de un subproceso, puede simplemente subprocess.wait () para que termine, por ejemplo. Si su tarea es esperar a que se toque un archivo o directorio en el sistema de archivos, puede usar pyinotify para que su código se active desde el evento del sistema de archivos manejado por el kernel.

Así es como se escribe un bucle infinito para la espera ocupada sin consumir demasiada CPU.


Si bien reinstalar Ubuntu es probablemente la forma más fácil, vale la pena señalar que es posible recuperarlo sin tener que reinstalar todo.

Para hacer esto, descargue manualmente el paquete python2.7 (y sus dependencias) e instálelos manualmente usando dpkg (sin pasar por APT, que requiere Python). Una vez que esté instalado, apt debería funcionar de nuevo, por lo que apt-get install ubuntu-desktop restaurará su sistema. (Si apt-get aún no funciona, es posible que también deba descargar e instalar las dependencias que falten).

En el futuro, si necesita reinstalar un paquete, utilice

que reinstala el paquete sin tener que eliminar las dependencias.

Eliminar Python no es una buena idea ya que gran parte de Ubuntu depende de ello. Es posible que haya visto una advertencia que le indica qué paquetes dependen de Python y, por lo tanto, se eliminarán con Python. Al continuar, terminas con un sistema operativo bastante reducido.

Reinstalar Ubuntu ahora sería la forma más fácil y segura de recuperarlo. Tenga cuidado de no borrar su HOME cuando lo haga.

Si no es demasiado tarde para nadie, o si se ha encontrado con este problema últimamente, así es como lo hice funcionar:

Seguí el consejo de Mechanical snail y descargué todos los paquetes usando Synaptic. Seleccioné todos los paquetes relevantes, básicamente todo con "python", "python2", "python3", "apt", "python-apt", etc., que ya estaba instalado en mi computadora, los etiqueté para reinstalación, y cuando golpeo solicitar, Me aseguré de descargarlos solo.

Luego, en la raíz, entré en la carpeta / var / cache / apt / archives y ejecuté el siguiente comando para reinstalar manualmente todo lo que descargué (verá todos los paquetes que descargó con Synaptic aquí):

De todos modos, recibía este error apt_pkg cada vez que recibía un mensaje de error de un script de Python en Aptana, y ayer cuando intentaba agregar un repositorio. Ahora al menos puedo agregar el repositorio sin problemas, pero sigo recibiendo el error apt_pkg cada vez que hay un error en mis scripts de Python.

Ejecutar el script fuera de Aptana llamando a python3.2 o python3 que apunta a 3.2 funciona (lo que significa que obtengo el error del script sin el error apt_pkg), pero si lo ejecuto con python3.3, el error vuelve.


`jupyter notebook` arroja` jupyter` no es un error reconocido en cmd win 10

Estoy usando Python 3.8 en un régimen fuera de línea. Es decir, si necesito instalar algún paquete, descargaré ese package.whl o package.tar.gz y lo instalaré usando pip install package.whl. Una vez quise instalar el portátil jupyter y necesitaba instalar muchos otros paquetes. Pacientemente instalé todo lo necesario. Al final, tengo el siguiente rastro:

Pensé "ahora funcionará"pero estaba equivocado, el comando del cuaderno jupyter en la terminal arrojó: 'jupyter' no se reconoce como un comando interno o externo, programa operable o archivo por lotes.

Tratando de encontrar una solución, busqué en Google y supe que debería usar Anaconda o tener jupyter.exe en mi C: py38 Scripts ruta (y esa ruta exacta debe agregarse a las variables del sistema). Pero no tengo jupyter.exe allí, pero ya he agregado C: py38 Scripts al lugar mencionado anteriormente. No estoy dispuesto a usar Anaconda (esa es otra historia) y para la última parte, hay estos archivos en la carpeta:

Intenté reiniciar la PC pero fue en vano.

¿Alguien podría ayudar con eso? Gracias

Editar: No sé qué se supone que debe hacer jupyter-notebook, pero cuando lo escribo en el cmd arroja lo siguiente:


Ver el vídeo: Introducción a PyQGIS Python en QGIS