2013-10-07 3 views
2

У меня есть сценарий с именем «poc.py», который принимает один аргумент командной строки «inputfile.txt». Сценарий poc.py использует argparse для обработки аргумента командной строки позиционирования, а затем передает аргументы args main(). Однажды в main(), я прочитал входной файл, сделаю некоторую обработку, создаю pandas DataFrame и, наконец, построю данные. Мне трудно манипулировать моим DataFrame и контролировать точное форматирование полученного графика, поэтому я хотел бы попробовать ipython, чтобы изучить это в интерактивном режиме и посмотреть, могу ли я лучше понять «pythonic» способы обработки pandas/matplotlib.python, ipython запустить интерактивный скрипт

Итак, я попытался поэкспериментировать с ipython и запустить скрипт, но я не могу заставить ipython сохранять пространство имен моего скрипта.

Я попытался это:

$ ipython --pylab -i poc.py inputfile.txt 

который работает мой сценарий просто отлично, и отображает графики (даже без блокировки plt.show() вызова), но когда сценарий закончен, команды ipython who и whos говорят Interactive namespace is empty , Точно так же, если я сначала введите IPython оболочку, а затем сделать:

In [2]: run poc.py inputfile.txt 

, когда сценарий выполняется (опять же, много продукции, графики показывают вверх) я получаю тот же результат: пустые интерактивное пространство имен.

Что мне не хватает в плане понимания внешнего вида и использования ipython для интерактивного изучения данных/объектов в моем сценарии?

Вот скелетный пример того, как мой сценарий (poc.py) является установка:

import numpy as np 
import matplotlib as plt 
import pandas as pd 

# etc ...more libraries and custom functions here... 

def main(args): 
    data = np.genfromtxt(args.inputfile) 

    # (omitted)...more data processing/manipulation... 
    pdata = pd.DataFrame(data) 

    # (omitted)...more data processing/manipulation... 
    plt.plot(pdata) 

    # (omitted)...some formatting of the matplotlib/axes/figure objects 
    plt.show() 


if __name__ == '__main__': 
    parser = argparse.ArgumentParser(description='''some program...''') 
    parser.add_argument('inputfile', help='path to input file') 
    args = parser.parse_args() 
    main(args) 
+0

Ваш модуль не имеет ничего в своем пространстве имен, кроме 'np',' plt', 'pd',' main', 'parser' и' args'. В частности, 'data' и' pdata' являются локальными переменными из уже завершенного вызова функции. Ваша проблема в том, что вы не можете увидеть 'pd' без повторного импорта или что' args' отсутствует? Или что вы не видите 'data' и' pdata'? – abarnert

+0

Я хотел бы видеть 'data' и' pdata'. Поэтому я предполагаю, что я хочу как-то отключить IPython до выхода из main() '? – tbc

+0

Ну, если Python останавливается перед выполнением 'main', эти значения даже не будут созданы. Но если это то, что вы хотите, это легко: просто «импортируйте» модуль вместо его запуска; то вы можете называть «главное» на досуге (и помещать точки останова отладчика или что-то еще). – abarnert

ответ

8

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

В принципе, потратив некоторое время, чтобы понять проблемы, о которых все говорили о моих переменных, выходящих из сферы действия, и о различных способах их решения, я нашел другое решение, которое сработало для меня. Я закончил использование функции embed() из IPython. Для процесса отладки я бы добавил

... 
from IPython import embed 
embed() 
... 

в месте, где я хотел остановиться и осмотреться.После того, как я упал в оболочку IPython, я мог исследовать переменные размеры и экспериментировать с манипулированием вещами. Когда я нашел комбо, которого я хотел, я бы скопировал команды, выпадал из интерактивного интерпретатора и модифицировал скрипт. Причина, по которой это сработало для меня, это не связано с изменением структуры программы просто для получения отладочной информации.

+0

Только то, что я искал. Удивительно, что этот вариант использования невозможен с помощью флагов командной строки для IPython. – hoju

1

Проблема здесь состоит в том, что data и pdata не в пространстве имен вашего скрипта; они находятся в локальном пространстве имен функции, которая уже запущена и завершена.

Если вы хотите, чтобы иметь возможность проверить их после факта, вам нужно их где-то хранить. Например:

# ... 
    plt.show() 

    return data, pdata, plt 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser(description='''some program...''') 
    parser.add_argument('inputfile', help='path to input file') 
    args = parser.parse_args() 
    data, pdata, plt = main(args) 

(В качестве альтернативы, вы можете просто сделать все основные-х переменных global, но этот способ кажется чище.)

Теперь пространство имен вашего скрипта включает в себя переменные с именами data, pdata и plt, которые имеют требуемые значения. Кроме того, вы можете снова позвонить main и передать ему другой файл и вернуть значения из этого файла.

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