В xonsh, как я могу получить из канала в выражение Python?

В xonsh shell, как я могу получить из канала в выражение Python? Пример с find команда в качестве провайдера канала:

find $WORKON_HOME -name pyvenv.cfg -print | for p in <stdin>: $(ls -dl @(p))

for p in <stdin>: это явно псевдокод. Чем мне его заменить?

Примечание: в bash я бы использовал такую ​​конструкцию:

... | while read p; do ... done

2 ответа

Решение

Самый простой способ передать входные данные в выражение Python - это использовать функцию, которая может быть вызвана как псевдоним, который принимает объект типа файла stdin. Например,

def func(args, stdin=None):
    for line in stdin:
        ls -dl @(line.strip())

find $WORKON_HOME -name pyvenv.cfg -print | @(func)

Конечно, вы можете пропустить @(func) поместив func в aliases,

aliases['myls'] = func
find $WORKON_HOME -name pyvenv.cfg -print | myls

Или, если все, что вы хотели сделать, это перебрать вывод findТебе даже не нужна труба.

for line in !(find $WORKON_HOME -name pyvenv.cfg -print):
    ls -dl @(line.strip())

Опираясь на ответ user2312428 вы можете сделать это в одной строке с вызываемым псевдонимом в виде лямбды. Функция принимает третий вид,def mycmd2(args, stdin=None). я выбросилargsс_потому что мне это не нужно и укоротилstdinкsдля удобства. Вот команда для хеширования файла:

      type image.qcow2 | @(lambda _,s: hashlib.sha256(s.read()).hexdigest())
Другие вопросы по тегам