Execute outro notebook ipython em um namespace separado
Eu tenho usado algum código muito legaleste exemplo para executar um notebook ipython de outro, que eu (basicamente) copio abaixo. Isso acaba sendo uma ótima maneira de organizar meu código.
Mas agora, quero comparar algumas expressões sympy que eu codifiquei com expressões sympy aproximadamente equivalentes que alguém codificou. E como há alguns conflitos de nomes, gostaria de poder executar os dois blocos de anotações em seus próprios namespaces, para que Bob e eu definamos uma expressão sympyx
Posso apenas avaliar
Bob.x - Me.x
para ver se eles são os mesmos (ou encontrar suas diferenças). [Note que é fácil alterar um dicionário de espaço de nomes para um espaço de nomes "acessível" usando algo comoeste objeto Bunch.]
Aqui está a função:
def exec_nb(nbfile):
from io import open
from IPython.nbformat import current
with open(nbfile) as f:
nb = current.read(f, 'json')
ip = get_ipython()
for cell in nb.worksheets[0].cells:
if cell.cell_type != 'code':
continue
ip.run_cell(cell.input)
O problema básico é oget_ipython
obtém a instância ipython atualmente em execução e, em seguida,run_cell
executa as células do outro bloco de notas no namespace atual dessa instância.
Eu não consigo descobrir como mudar isso. Por exemplo, executando o comando inteiro emexec
com um namespace diferente ainda encontra a instância ipython atual e usa esse namespace.
Além disso, ambos os notebooks precisam ser executados no ipython; Eu não posso exportá-los para um script e executar os scripts em um namespace.