2017-11-21 3 views
1

xonsh을 사용하여 디렉토리의 모든 md 파일에서 pandoc을 실행하고 싶습니다. 나는 subprocess을 사용할 수 있지만 그것은 xonsh에서 불필요한 것 같습니다. 여기에 지금까지 시도했습니다 무엇 :이xonsh에서 for 루프의 셸 명령을 실행하는 방법은 무엇입니까?

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

내가 얻을 SyntaxError : 내가 마지막 라인을 변경하는 경우

SyntaxError: :3:11: ('code: $fn',) pandoc $fn > ${bname}.html

: pandoc $fn > $bname.html를, 내가 얻을 :

pandoc: $fn: openBinaryFile: does not exist (No such file or directory)

나는 문제가 그 내부의 for 루프가 파이썬 모드이지만, pandoc 호출이 서브 프로세스 모드에 있어야한다고 가정한다. 이 으로 어떻게 처리됩니까? 얻기 위해

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

: 내가 답을 알아 낸 생각

답변

3

파이썬 변수를 서브 프로세스 (암시 적 xonsh 의미)에서 사용할 수있게하려면 @()에 래핑 할 수 있습니다. 또한, 거기에 내장 된 globber 구문을 다음과 같이 프로세스를 작성할 수 있도록 : 그들은 subproc에서 파이썬 변수이기 때문에 모두 fn'{}.html'.format()@()에 싸여해야한다는

import os.path 

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

주 (당신 때문에 명령 행 기능을 호출하여 행을 시작합니다).

명시 적으로 envvars를 설정해야하는 다른 프로그램에서 사용할 수 없으면 환경 변수를 만들 필요가 없습니다.

희망 하시겠습니까?

+0

'@ (bname) .html'을 할 수 있습니까? – Paul

+1

나는 파서가 그것을 좋아하지 않을 것이라고 생각한다. 일반적으로 단일 엔터티에 비 공백으로 구분 된 토큰을 유지하려고합니다. 방금 공개 된 xonsh 0.6.0에서는 fstrings을 지원하므로'@ (f '{bname} .html')' –

0

, for 루프 내 subprocess-mode을 활성화하기 위해, 당신은 $[] 구문을 사용하여 uncaptured subprocess에 명시 적으로 할 수있는 것 하위 프로세스로 전파 할 파이썬 변수는 $varname으로 선언해야합니다.

+0

내 문제를 해결하지만 더 나은 방법이있는 경우 다른 대답을 수락합니다. – Paul

관련 문제