Как запустить команду оболочки в цикле for в xonsh?

Я хотел бы использовать xonsh выполнить pandoc на всех md файлы в каталоге. Я мог бы использовать subprocess, но это похоже на то, что было бы ненужным в xonsh, Вот что я пробовал до сих пор:

from glob import glob
import os
for fn in glob('*.md'):
    bname, _ = os.path.splitext(fn)
    pandoc $fn > ${bname}.html

С этим я получаю SyntaxError:

Ошибка синтаксиса::3:11: ('code: $fn',) pandoc $fn > ${bname}.html

Если я изменю последнюю строку на: pandoc $fn > $bname.html, Я получил:

pandoc: $ fn: openBinaryFile: не существует (такого файла или каталога нет)

Я предполагаю, что проблема в том, что внутри for цикл в режиме Python, но pandoc вызов должен быть в режиме подпроцесса. Как это должно быть сделано?

2 ответа

Решение

Если вы хотите, чтобы переменные Python были доступны для подпроцессов (в неявном смысле xonsh), вы можете обернуть их в @(), Кроме того, есть встроенный синтаксис globber, поэтому вы можете написать процесс следующим образом:

import os.path

for fn in g`*.md`:
    _, bname = os.path.split(fn)
    pandoc @(fn) > @('{}.html'.format(bname))

Обратите внимание, что оба fn и '{}.html'.format() должен быть завернут в @() потому что они являются переменными Python в подпроцессе (потому что вы вызвали функцию командной строки, чтобы начать строку).

Кроме того, вам не нужно делать их переменными среды, если вы не хотите, чтобы они были доступны другим программам, для которых явно требуется установить envvars.

Надеюсь, это поможет!

Я думаю, что я разобрался с ответом, кажется, что для активации subprocess-mode в пределах for цикл, вы можете сделать это явно с не захваченным подпроцессом, используя $[] синтаксис:

from glob import glob
import os
for $fn in glob('*.md'):
    _, $bname = os.path.split($fn)
    $[pandoc $fn > $bname.html]

Чтобы заставить переменные python распространяться в подпроцесс, кажется, вам нужно объявить их как $varname,

Другие вопросы по тегам