Как передать в оболочке xonsh вывод конструкции Python другой команде? - PullRequest
0 голосов
/ 29 октября 2018

В оболочке xonsh как я могу передать вывод конструкции Python другой команде? Желаемый пример:

for v in ${...}: print ("{}={}".format(v,${v})) | head

В этом for v in ... - это конструкция Python, а head - это команда, через которую я хочу передать свой вывод.

Командная строка выше не работает; Я всегда получаю следующую ошибку:

NameError: name 'head' is not defined

Похоже, xonsh не покидает Python-режим для символа канала (см. «Трубы» в документации xonsh ). - Итак, как я могу дать xonsh команду понимать символ канала здесь как символ режима подпроцесса?

1 Ответ

0 голосов
/ 29 октября 2018

Xonsh не может поддерживать передачу произвольного кода Python в подпроцессы, поскольку подпроцессы принимают только строковые входные данные. Следовательно, xonsh принимает только выражения Python, которые являются строками, содержат строки (например, списки строк) или возвращают строки (например, функции). Причина того, что xonsh принимает выражения только для подпроцессов, заключается в том, что сам подпроцесс реализован как выражение.

Проблема с приведенным выше примером кода заключается в том, что вы пытаетесь передать оператор (в частности, оператор for) в подпроцесс (который является выражением). Это не синтаксически допустимо в чистом Python и не в xonsh, потому что неясно, к какому из операторов в | следует применить выражение после |.

Чтобы исправить вышесказанное, вам нужно изменить цикл for на выражение. Вот несколько примеров того, как:

# use a list comprehension
echo @(["{}={}\n".format(v,${v}) for v in ${...}]) | head

# use a function
def f(): 
    for v in ${...}: 
        print("{}={}".format(v,${v}))

@(f) | head
...