Перенаправление вывода интерактивных команд Python / ipython в файлы или переменные

Если я выполняю функцию в командной строке Python или Ipython, например " help (dir)":

>>> help(dir)
Help on built-in function dir in module __builtin__:

dir(...)
    dir([object]) -> list of strings

    If called without an argument, return the names in the current scope.

Я хотел бы записать полученный результат в файл или переменную, но

>>> x = help(dir)        
>>> help(dir) >file.txt   
>>> help(dir) >>file.txt

не работают. Я вижу связанный с этим вопрос (перенаправить вывод команды в переменную или файл?) хотя это ужасно сложно, было бы трудно вспомнить на лету, и неясно, применяется ли это здесь.

в оболочке bash, выход может быть перенаправлено с помощью > или 2>. Кажется, что должно быть легко сделать что-то подобное в оболочке Python или Ipython.

2 ответов


Использовать IPython capture_output функции

In [21]: from IPython.utils import io

In [22]: with io.capture_output() as captured:
   ....:   help(dir)
   ....:   

In [23]: print captured.stdout
Help on built-in function dir in module __builtin__:

dir(...)
    dir([object]) -> list of strings

    If called without an argument, return the names in the current scope.

обновление

в случае, если выше решение не работает, вы можете использовать функцию захвата вывода команды ipython. Например:

In [6]: output = !python -c 'help(dir)' | cat

In [7]: output
Out[7]: 
['Help on built-in function dir in module __builtin__:',
 '',
 'dir(...)',
 '    dir([object]) -> list of strings',

даже лучше, чем методы выше, (оба из которых будут работать), насколько проще запомнить и не требуется импорт, это IPython magic %%capture:

In [38]: %%capture myout
   ....: help(dir)
   ....:

In [39]: print myout.stdout
Help on built-in function dir in module __builtin__:

dir(...)
    dir([object]) -> list of strings

    If called without an argument, return the names in the current scope.
    Else, return an alphabetized list of names comprising (some of) the attributes 
    of the given object, and of attributes reachable from it.
    If the object supplies a method named __dir__, it will be used; otherwise
    the default dir() logic is used and returns:
      for a module object: the module's attributes.
      for a class object:  its attributes, and recursively the attributes
        of its bases.
      for any other object: its attributes, its class's attributes, and
        recursively the attributes of its class's base classes.