В 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())