Atualmente, estou trabalhando em um projeto python que contém submódulos e usa numpy / scipy. O Ipython é usado como console interativo. Infelizmente, não estou muito satisfeito com o fluxo de trabalho que estou usando agora, gostaria de receber alguns conselhos.
No IPython, a estrutura é carregada por um import
comando simples . No entanto, geralmente é necessário alterar o código em um dos submódulos da estrutura. Neste ponto, um modelo já está carregado e eu uso o IPython para interagir com ele.
Agora, a estrutura contém muitos módulos que dependem uma da outra, ou seja, quando a estrutura é carregada inicialmente, o módulo principal está importando e configurando os submódulos. As alterações no código são executadas apenas se o módulo for recarregado usando reload(main_mod.sub_mod)
. Isso é complicado, pois preciso recarregar todos os módulos alterados individualmente, usando o caminho completo. Seria muito conveniente se reload(main_module)
também recarregasse todos os submódulos, mas sem recarregar numpy / scipy ..
However, it is often necessary to change code in one of the submodules of the framework.
Então, por que énecessary to change code
? ObrigadoRespostas:
O IPython vem com alguma mágica de recarga automática :
Ele recarregará todos os módulos alterados todas as vezes antes de executar uma nova linha. A maneira como isso funciona é um pouco diferente
dreload
. Algumas advertências se aplicam, digite%autoreload?
para ver o que pode dar errado.Se você deseja sempre ativar essas configurações, modifique seu arquivo de configuração IPython
~/.ipython/profile_default/ipython_config.py
[1] e adicione:Crédito para @Kos através de um comentário abaixo.
[1] Se você não possui o arquivo
~/.ipython/profile_default/ipython_config.py
, precisa ligaripython profile create
primeiro. Ou o arquivo pode estar localizado em$IPYTHONDIR
.fonte
c.InteractiveShellApp.extensions = ['autoreload']
ec.InteractiveShellApp.exec_lines = ['%autoreload 2']
no meu~/.ipython/profile_default/ipython_config.py
.No IPython 0.12 (e possivelmente anterior), você pode usar isto:
Isto é essencialmente o mesmo que a resposta por pv. , exceto que a extensão foi renomeada e agora é carregada usando
%load_ext
.fonte
Por algum motivo,
%autoreload
nemdreload
parece funcionar para a situação quando você importa código de um notebook para outro . Somente o Python simplesreload
funciona:Baseado em [1] .
fonte
%autoreload
técnica. Há um relatório de bug aberto para adicionar suporte%autoreload
para isso. .O IPython oferece
dreload()
recarregar recursivamente todos os submódulos. Pessoalmente, prefiro usar o%run()
comando mágico (embora ele não execute uma recarga profunda, como apontado por John Salvatier nos comentários).fonte
dreload
foi substituído no IPython recente (por exemplo, IPython 6.0) por deepreload .Módulo denominado
importlib
permitir acessar para importar internals. Especialmente, fornece a funçãoimportlib.reload()
:Ao contrário
%autoreload
,importlib.reload()
também redefina as variáveis globais definidas no módulo. Na maioria dos casos, é o que você deseja.importlib
está disponível apenas desde o Python 3.1. Para a versão mais antiga, você tem que usar o móduloimp
.fonte
http://shawnleezx.github.io/blog/2015/08/03/some-notes-on-ipython-startup-script/
Para evitar digitar essas funções mágicas repetidamente, elas podem ser colocadas no script de inicialização do ipython (nomeie-o com o sufixo .py em .ipython / profile_default / startup. Todos os scripts python nessa pasta serão carregados de acordo com a ordem lexical), que se parece com o seguinte:
fonte
%run script.py
a partir do IPython REPLQue tal agora:
Isso deve recarregar efetivamente toda a árvore de módulos e submódulos fornecidos. Você também pode colocar essa função no seu .ipythonrc (eu acho) para que ela seja carregada toda vez que você iniciar o intérprete.
fonte
from ... import ...
orimport ... as
. Pelo menos isso está me causando problemas ao trabalhar interativamente no terminal. Eu mudei para usar macros armazenadas no IPython que fazem as importações e configurações necessárias para começar a trabalhar em um estado predefinido.from ... import ...
eimport ... as
desde que o que você importou seja um módulo. A única coisa que ele não cobre são os módulos de um pacote que não foram carregados do__init__.py
arquivo. Para pacotes, você provavelmente pode verificar se o__path__
atributo do módulo é um diretório. Se estiver, percorra-o e importe recursivamente todos os módulos que você pôde encontrar. Não escrevi esta parte porque o autor não pediu uma solução para os pacotes.pkgutil
para obter todos os submódulos de um pacote, mesmo que o pacote não importe os submódulos para o módulo superior. stackoverflow.com/a/1707786/1243926sys.modules:
Outra opção:
Verificado no ipython e ipython3 v5.1.0 no Ubuntu 14.04.
fonte
Minha prática padrão para recarregar é combinar os dois métodos após a primeira abertura de
IPython
:Carregar módulos antes de fazer isso fará com que eles não sejam recarregados, mesmo com um manual
reload(module_name)
. Eu ainda, muito raramente, tenho problemas inexplicáveis com métodos de classe que não são recarregados que ainda não examinei.fonte
Observe que o mencionado acima
autoreload
só funciona no IntelliJ se você salvar manualmente o arquivo alterado (por exemplo, usando ctrl + s ou cmd + s). Parece não funcionar com o salvamento automático.fonte
Nos cadernos Jupyter no Anaconda, faça o seguinte:
produziu a mensagem:
Parece que é preferível fazer:
Versão informação:
fonte
Quaisquer subobjetos não serão recarregados por isso, acredito que você precise usar o deepreload do IPython para isso.
fonte