Как передать в оболочке xonsh вывод конструкции Python другой команде?
В xonsh
shell, как я могу передать вывод конструкции Python другой команде? Желаемый пример:
for v in ${...}: print ("{}={}".format(v,${v})) | head
В этом for v in ...
является конструкцией Python и head
это команда, через которую я хочу передать свой вывод.
Командная строка выше не работает; Я всегда получаю следующую ошибку:
NameError: name 'head' is not defined
Похоже xonsh
не покидает Python-режим для символа канала (см. "Pipes" в документации по xonsh). - Итак, как я могу наставить xonsh
понимать символ канала здесь как символ режима подпроцесса?
1 ответ
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