Как запустить команду оболочки в цикле 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
,