Mais

QGIS: compilação personalizada, erro de python

QGIS: compilação personalizada, erro de python


Eu criei o código-fonte do qgis no windows 7. As bibliotecas foram baixadas do site osgeow4. Até instalei o postgress como autônomo.

Estou recebendo este erro quando o aplicativo é iniciado ...

Arquivo "C: /development/qgis2.9.0 /./ python / plugins processing algs qgis postgis_utils.py", linha 28, na importação psycopg2
Arquivo "C: /development/qgis2.9.0 /./ python qgis utils.py", linha 483, em _import mod = _builtin_import (nome, globais, locais, fromlist, nível)
Arquivo "C: development OSGeo4W apps Python27 Lib site-packages psycopg2__init __. Py", linha 71, em de psycopg2._psycopg import BINARY, NUMBER, STRING, DATETIME, ROWID
Arquivo "C: /development/qgis2.9.0 /./ python qgis utils.py", linha 483, em _import mod = _builtin_import (nome, globais, locais, fromlist, nível) ImportError: Falha ao carregar DLL: O módulo especificado Não pode ser achado.

Eu verifiquei todos os meus caminhos de python etc, mas não tenho certeza sobre o que está faltando o plug-in psycopg2.

Qualquer direção seria ótima.


Eu não tenho nenhuma ideia de por que o instalador do osgeo4w o deixaria neste estado. Eu teria imaginado que ele instalaria todas as DLLs necessárias.

Mas minha experiência com "O módulo especificado não pode ser encontrado" é que quase sempre é uma de duas coisas:

  1. Um problema com oCAMINHOvariável de ambiente para que Python (ou qualquer outro) não consiga encontrar suas bibliotecas de cliente PostgreSQL (ou seja, as coisas que vivem emC: Arquivos de programas PostgreSQL 9.3 bin) ou
  2. Uma incompatibilidade de arquitetura entre as bibliotecas Python e PostgreSQL (por exemplo, seu Python é de 32 bits e seu PostgreSQL é de 64 bits).

Se você tiver o know-how, talvez possa verificar essas coisas para ver se há algum problema.


Maneira adequada de declarar exceções personalizadas no Python moderno?

Qual é a maneira correta de declarar classes de exceção personalizadas no Python moderno? Meu objetivo principal é seguir qualquer padrão que outras classes de exceção tenham, de forma que (por exemplo) qualquer string extra que eu inclua na exceção seja impressa por qualquer ferramenta que tenha capturado a exceção.

Por "Python moderno" quero dizer algo que será executado no Python 2.5, mas será 'correto' para o Python 2.6 e Python 3. * maneira de fazer as coisas. E por "personalizado", quero dizer um objeto Exception que pode incluir dados extras sobre a causa do erro: uma string, talvez também algum outro objeto arbitrário relevante para a exceção.

Fiquei surpreso com o seguinte aviso de suspensão de uso no Python 2.6.2:

Parece loucura que BaseException tenha um significado especial para atributos chamados mensagem. Percebi pelo PEP-352 que o atributo tinha um significado especial no 2.5 que eles estão tentando descontinuar, então acho que esse nome (e apenas aquele) agora é proibido? ECA.

Também estou vagamente ciente de que o Exception tem alguns argumentos de parâmetros mágicos, mas nunca soube como usá-los. Nem tenho certeza de que é a maneira certa de fazer as coisas daqui para frente. Muitas das discussões que encontrei online sugeriam que eles estavam tentando acabar com os args no Python 3.

Atualização: duas respostas sugeriram substituir __init__ e __str__ / __unicode__ / __repr__. Parece muita digitação, é necessário?


Todos os módulos em Python precisam ter uma certa estrutura de diretório. Você pode encontrar detalhes aqui.

Crie um arquivo vazio chamado __init__.py no diretório do modelo, de forma que sua estrutura de diretório seja semelhante a esta:

Além disso, no arquivo hello-world.py, altere a instrução de importação para o seguinte:

P.S .: Se você estiver colocando seu diretório de modelo em algum outro local (não no mesmo branch de diretório), você terá que modificar o caminho do python usando sys.path.

você precisa de um arquivo denominado __init__.py (dois sublinhados em cada lado) em cada pasta na hierarquia, portanto, um em src / e um em model /. Isso é o que o python procura para saber se deve acessar uma pasta específica. Os arquivos devem conter instruções de inicialização, mas mesmo que você os crie vazios, isso resolverá o problema.

Se for o seu módulo raiz, basta adicioná-lo a PYTHONPATH (PyCharm geralmente faz isso)

Você precisa ter certeza de que o módulo está instalado para tudo versões de python

Você pode verificar se um módulo está instalado para python executando:

pip desinstalação nome do módulo

Se estiver instalado, ele perguntará se você deseja excluí-lo ou não. Meu problema é que ele foi instalado para python, mas não para python3. Para verificar se um módulo está instalado para python3, execute:

desinstalação de pip python3 -m nome do módulo

Depois de fazer isso, se você descobrir que um módulo não está instalado para uma ou ambas as versões, use estes dois comandos para instalar o módulo.


Para Python 2.6 e posterior e Python 3.x:

Para Python 2.5 e anterior, use:

O módulo traceback fornece métodos para formatar e imprimir exceções e seus tracebacks, por exemplo, isso imprimiria uma exceção como o manipulador padrão faz:

Em Python 2.6 ou superior é um pouco mais limpo:

Em versões mais antigas, ainda é bastante legível:

Caso você queira passar strings de erro, aqui está um exemplo de Erros e Exceções (Python 2.6)

(Eu ia deixar isso como um comentário sobre a resposta de @jldupont, mas não tenho reputação suficiente.)

Já vi respostas como a de @jldupont em outros lugares também. FWIW, acho importante observar que:

imprimirá a saída de erro em sys.stdout por padrão. Uma abordagem mais apropriada para o tratamento de erros em geral seria:

(Observe que você precisa importar sys para que isso funcione.) Dessa forma, o erro é impresso em STDERR em vez de STDOUT, o que permite a análise / redirecionamento de saída adequado / etc. Eu entendo que a questão era estritamente sobre 'imprimir um erro', mas parece importante apontar a prática recomendada aqui, em vez de deixar de fora esse detalhe que pode levar a um código fora do padrão para qualquer pessoa que não aprenda melhor.

Não usei o módulo traceback como na resposta do Cat Plus Plus, e talvez seja a melhor maneira, mas pensei em jogar isso fora.


É um problema que você terá que resolver colocando na lista de permissões o certificado CA usado para assinar o certificado do servidor remoto ao qual você está tentando se conectar a partir das configurações do sistema. Mas apenas para fins de teste, você pode desativar a verificação usando:

Não use isso na produção.

Este erro quase certamente significa que o ponto de extremidade remoto não está assinado com um certificado em seu armazenamento de autoridade de certificação local. Você tem duas opções:

Instale o certificado no armazenamento de CA que solicita o uso. Por padrão, este é o armazenamento de CA do seu sistema local, pelo menos tão bem quanto pode ser determinado por solicitações.

Configure um conjunto diferente de certificados a ser usado em um objeto de sessão de solicitações.


Assista o vídeo: I Encontro Brasileiro de usuários QGIS: Scripts no QGIS