Можно ли проверять наличие глобальных переменных в IPython при запуске файла?

#python #ipython

#python #ipython

Вопрос:

У меня есть файл, подобный so:

 import pandas a pd

def a_func():
    print 'doing stuff'

if __name__ == "__main__":
    if 'data' not in globals():
        print 'loading data...'
        data = pd.read_csv('datafile.csv')
  

Когда я запускаю файл в IPython с run file.py помощью, он всегда загружает данные, но когда я печатаю globals.keys() в IPython, я вижу data переменную. Есть ли способ получить доступ к глобальным переменным из IPython из моего file.py скрипта, чтобы мне не приходилось загружать данные каждый раз, когда я запускаю скрипт в IPython?

Комментарии:

1. IPython обычно создает новое пространство имен для каждого вашего файла %run , а затем впоследствии переносит переменные в ваше интерактивное пространство имен. Если вы действительно хотите запускать файлы непосредственно в интерактивном пространстве имен, %run -i сделайте это.

Ответ №1:

Каждый раз, когда выполняется файл python, словарь globals() сбрасывается интерпретатором. Так что, если вы попытаетесь сделать что-то вроде

 print globals().keys()
  

вы можете видеть, что «данные» не в глобальных. Этот словарь обновляется по мере запуска программы. Поэтому я не думаю, что вы можете ссылаться на globals() IPython в программе.

проверьте эту ссылку , согласно ей глобальные переменные очищаются.

Комментарии:

1. Я думаю, что с IPython он предварительно помещает пустое / None, присвоенное data в глобальную область видимости (даже если конкретная строка не была / никогда не будет запущена).

2. проверьте эту ссылку docs.python.org/2/faq /… , в соответствии с этим это пустые глобальные переменные.

3. Да, я использую Python чуть более десяти лет, но пытался понять, почему человек, задающий вопрос, подумал data бы, что это в globals() . Только что протестировал его, и Cpy2 не назначает глобальные переменные, поэтому это спорный вопрос.