簡體   English   中英

如何在Xonsh的for循環中運行Shell命令?

[英]How to run a shell command in a for loop in xonsh?

我想使用xonshpandoc中的所有md文件執行pandoc 可以使用subprocess xonsh ,但這似乎在xonsh是不必要的。 到目前為止,這是我嘗試過的方法:

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

有了這個我得到一個SyntaxError

語法錯誤:: 3:11 :(“代碼:$ fn”,)pandoc $ fn> $ {bname} .html

如果將最后一行更改為: pandoc $fn > $bname.htmlpandoc $fn > $bname.html得到:

pandoc:$ fn:openBinaryFile:不存在(沒有這樣的文件或目錄)

我以為問題是for循環內部是Python模式,但是pandoc調用必須處於子pandoc模式。 應該怎么做?

如果希望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的程序,否則無需使它們成為環境變量。

希望有幫助!

我相信我已經找到了答案,似乎為了激活for循環內的子進程 subprocess-mode ,您可以使用$[]語法使用未捕獲的子進程來顯式地執行此操作:

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

為了使python變量傳播到子進程中,您似乎需要將它們聲明為$varname

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM