2010-04-22 69 views
6

有,我自動地創建一個從Python的小shell腳本時,我想,以確保該文件名參數不包含非轉義特殊字符。我已經推出了我自己的解決方案,我將提供一個答案,但我幾乎可以肯定,我看到這樣的功能在標準庫的某處丟失了。通過「丟失」我的意思是我不喜歡shlexcmdsubprocess明顯的模塊中找到它。報價POSIX外殼在Python輸出的特殊字符

你知道在STDLIB這樣的功能呢?如果是的話,它在哪裏?

甚至爲負值(但明確而正確的答案:)將被接受。

+1

可能重複[什麼是最好的方法來逃避os.system()調用在Python?](http://stackoverflow.com/questions/35817/whats-the-best-way-to-escape-os- system-calls-in-python) - 儘管另一個人在談論os.system,但事實並非如此,爲了同樣的目的,這也是相同的引用。它有相同的答案。 – 2010-10-03 20:12:29

回答

6

pipes.quote()

>>> from pipes import quote 
>>> quote("""some'horrible"string\with lots of junk!$$!""") 
'"some\'horrible\\"string\\\\with lots of junk!\\$\\$!"' 

雖然注意到這可以說是得到了一個錯誤,其中一個零長度ARG將返回什麼:

>>> quote("") 
'' 

也許它會更好,如果它返回'""'

+0

是的,謝謝!它是一個明顯的模塊(對於POSIX用戶),所以我錯了。 – tzot 2010-04-22 17:23:55

+0

有時'subprocess.list2cmdline'也是有用的;它不*轉義shell元字符,但是處理轉義引用和轉義空格,所以當你想調用一個遠程shell但是它通過一個或多個額外的去轉義層的時候,比如via 'ssh'遠程命令調用。 – 2013-05-23 02:50:32

1

我使用的功能是:

def quote_filename(filename): 
    return '"%s"' % (
     filename 
     .replace('\\', '\\\\') 
     .replace('"', '\"') 
     .replace('$', '\$') 
     .replace('`', '\`') 
    ) 

那就是:我始終將文件名用雙引號,然後引用雙引號內特殊的唯一字符。

+0

當你提出一個問題來回答它時,這難道不是真氣嗎?它首先是一個愚蠢的行爲? :P(最近也發生在我身上) – 2010-10-03 20:37:08

+0

@Roger:地獄。 SO的搜索機制需要改進。我*確實*在詢問之前尋找答案。請注意,我的答案從來沒有打算被選爲*答案。我也投了票結束這個問題。 – tzot 2010-10-03 21:19:27

+0

[事實上,它的確如此。](http://meta.stackexchange.com/questions/42878/show-related-questions-just-before-question-submission)我並沒有試圖對你提出的問題說任何壞話問題(甚至在完成所有寫入和發佈的思維過程之後才能進行搜索),只是試圖分享挫敗感。 – 2010-10-04 04:33:13