Jupyter / I Python SList :: Получение нетексированного вывода из оператора выполнения оболочки "!" - PullRequest
0 голосов
/ 29 января 2020

Когда команды оболочки выполняются в пределах Jupyter Notebook Python Cell, например:

output = ! some-shell-command

каждая строка, отправляемая на стандартный вывод (stdout), записывается в list как IPython структура данных, называемая SList. Например:

output = !echo -e 'line1\nline2\nline3'
print(output) # A IPython SList data-structure.

['line1', 'line2', 'line3']

Иногда, однако, вы хотите сохранить исходный формат вывода строки без токенизации в список, например:

print(output)

line1
line2
line3

Пример: для структурированного вывода JSON - строки, содержащей много символов новой строки - вы не хотели бы, чтобы этот токенизация происходила .

Как тогда я могу выполнить команды оболочки в Jupyter Notebooks, используя оператор !, и получить некотенизированный вывод (как выше)?

В идеале решение должно быть чем-то нативным в Jupyter Notebooks.

Спасибо!

Ответы [ 2 ]

1 голос
/ 30 января 2020

SList имеет ряд свойств, которые возвращают его в различных формах:

https://gist.github.com/parente/b6ee0efe141822dfa18b6feeda0a45e5

In [151]: ret = !ls *.json                                                                       
In [152]: ret                                                                                    
Out[152]: ['foo1.json', 'foo.json', 'logins.json', 'stack56532806.json']

как список

In [153]: ret.l                                                                                  
Out[153]: ['foo1.json', 'foo.json', 'logins.json', 'stack56532806.json']

в виде строки, разделенной новой строкой:

In [154]: ret.n                                                                                  
Out[154]: 'foo1.json\nfoo.json\nlogins.json\nstack56532806.json'

в качестве разделителя пробелов:

In [155]: ret.s                                                                                  
Out[155]: 'foo1.json foo.json logins.json stack56532806.json'
In [156]: type(ret)                                                             

его документы

In [158]: ret?                                                                                   
Type:        SList
String form: ['foo1.json', 'foo.json', 'logins.json', 'stack56532806.json']
Length:      4
File:        /usr/local/lib/python3.6/dist-packages/IPython/utils/text.py
Docstring:  
List derivative with a special access attributes.

These are normal lists, but with the special attributes:

* .l (or .list) : value as list (the list itself).
* .n (or .nlstr): value as a string, joined on newlines.
* .s (or .spstr): value as a string, joined on spaces.
* .p (or .paths): list of path objects (requires path.py package)

Any values which require transformations are computed only once and
cached.
1 голос
/ 29 января 2020

Используйте join() для объединения итератора в строку.

"\n".join(output)
...