2016-03-31 4 views
0

Некоторые пользователи в моей лаборатории используются в рабочей области Matlab и начинаются с ноутбука ipython. Итак, я попытался имитировать рабочее пространство с помощью виджетов ipython. Внутри ipython.py есть класс рабочей области. Я пытался использовать его как рабочее пространство (get_ipython()), но класс не имеет доступа к переменным ipython из сценария. Если я определяю этот класс внутри ноутбука, он работает, но не из сценария.Рабочее пространство IPython

Так что я положил главный, я исполняю файл с Exec() и отобразить объект рабочего пространства:

path = '/home/download/' 
file = 'ipython.py' 
exec(open(path+file).read()) 
wksp 

executiong метод работает, но это действительно некрасиво. У кого-то есть идея, как сделать это лучше?

ipython.py

ответ

0

Вы должны использовать

execfile() 

Dont использование Exec()

пример:

execfile('/Home/Downloads/lel.py') 

или для вас:

path = '/home/download/' 
file = 'ipython.py' 
execfile(path+file) 

и в вашем ipython.py, используйте

if not __name__ == '__main__': 
    # Call you object 

Привет !!

+0

Thx! У меня Python 3, я прочитал, что execfile был удален. Я могу сделать py2to3 для execfile, но вместо одной функции у меня будет два. Я думаю, что мне нужно адаптировать ipython.py, но я просто не знаю, как это сделать! –

+0

Привет, dude, @EtienneCmb прочитайте это сообщение для python 3x http://stackoverflow.com/a/437857/4941927 может помочь вам, если вам нужна помощь, напишите мне, пожалуйста: D – Milor123

0

Возможно, мне что-то не хватает, потому что я не понимаю, почему вы хотите запустить это как скрипт. Я бы просто удалил if __name__ == '__main__, а затем импортировал wksp из модуля в блокнот.

from ipython import wksp 
display(wksp) 

Как объяснено в комментариях текущий код призывающих eval() на имена, определенные в записной книжке, что не работает, потому что эти имена не определены в области, в которой eval() называется. Но вы можете избежать eval():

names = namespace.who_ls() 
values = [namespace.shell.user_ns[name] for name in names] 
types = [type(v) for v in varlist] 
+0

Проблема в том, что мой класс рабочей области не работает, t имеют доступ к переменным ноутбука ipython. Если класс определен внутри ноутбука, он работает. Вот почему он запускает его как скрипт, потому что он находит переменные. Но, как вы сказали, лучшей практикой было бы импортировать ее. –

+0

О, я вижу. Но должен быть способ ... – Goyo

+0

Это точно. Я вынужден использовать этот уродливый способ загрузки, конечно, потому что мой класс не совсем определен ... –

Смежные вопросы