2016-08-24 131 views
1

如果以前有人問過這個問題,我的確在搜索它,但是所有的匹配似乎都是關於python原始字符串,而不是關於argparse。Python Argparse:原始字符串輸入

無論如何,我有一個代碼,用戶在一個字符串中輸入,然後處理這個字符串。但是,我有一個問題,因爲我希望我的代碼能夠區分\n\\n,以便用戶可以控制它們是否出現換行符或分別在輸出中顯示\n

這本身很簡單,我可以通過邏輯來檢查字符串等等。然而,argparse似乎並沒有保持原始輸入字符串。所以如果我要寫:Here is a list:\nItem 1它被解析爲Here is a list:\\nItem 1。因爲如果我在輸入字符串中將\n替換爲\\n,則會分析完全相同的內容,因此無法區分這兩者。

我可以包括一個bodge(例如,我可以讓用戶輸入$\n\n出現在輸出中,或者只是\n換行符)。但是這很混亂,並且使代碼的使用複雜化。

有沒有辦法確保被argparse解析的字符串是原始的? (也就是說,如果我進入\n它解析\n而不是\\n

再次,對不起,如果這之前已經問過,但我找不到在試圖尋找一個答案一個小時的回答後,我出於想法(酒吧酒吧)。提前爲所有幫助而歡呼。

示例代碼(對不起,如果這也不行,不知道如何最好地爲argparse做示例代碼!):

import argparse 

parser = argparse.ArgumentParser(description = 'Test.') 
parser.add_argument('text', action = 'store', type = str, help = 'The text to parse.') 

args = parser.parse_args() 

print(repr(args.text)) 
+2

您需要分離Python處理的內容和shell處理的內容。 'argparse'只能解析傳遞給Python進程的命令行參數,但它不能修改sh​​ell如何處理這些參數。現在可能或可能發生一些逃跑,例如, 'python -c「import sys; print sys.argv」My \ nMagic \ nString'會在Windows的'cmd.exe'中輸出不同的值,在'bash'中輸出不同的值,即使我們在提示符中鍵入了相同的字符。 –

+0

可能的重複[如何在python中不轉義反斜線轉義的字符串?](http://stackoverflow.com/questions/1885181/how-do-i-un-escape-a-backslash-escaped-string -in-python) – zondo

+0

答案與argparse無關。 – zondo

回答

1

這裏是一個可能的解決問題的方法:

import argparse 

parser = argparse.ArgumentParser(description='Test.') 
parser.add_argument('text', action='store', type=str, help='The text to parse.') 

args = parser.parse_args() 

print '-' * 80 
raw_text = eval('"' + args.text.replace('"', '\\"') + '"') 
print raw_text 
print '-' * 80 
print args.text 

但請注意一件事,eval really is dangerous

+0

可悲的是,似乎沒有工作。我認爲@ Lukasz-rogalski可能是正確的(如果我正確地理解他,那是),它實際上是終端,這是問題,而不是argparse :( – Steve

+0

@Steve [嘗試進一步闡述,因爲顯然我測試了我的答案之前(http://screencast.com/t/JoTkoZgt0C) – BPL

+1

@BLP對不起,我在那裏說得不好,我不是故意說它不起作用,而是當我用它時,它沒有得到我認爲Lukasz已經認識到,事情的終端方面就是問題,也就是說,如果我在終端中編寫'\\ n'(解析)賦予解析器的是實際上'\ n';所以在python方面什麼都不能做,我認爲這是終端自動忽略額外反斜槓的情況,因此,看起來我需要在終端中使用'\\\ n'得到它給解析器'\\ n'。 – Steve

1

正如在評論中指出的,​​與sys.argv一起工作,這是一個由shell和pyth生成的列表譯員。

用一個簡單的argv回聲腳本:

0928:~/mypy$ cat echo_argv.py 
import sys 
print(sys.argv) 

我得到(使用的是bash shell):

0929:~/mypy$ python echo_argv.py Here is a list:\nItem 1 
['echo_argv.py', 'Here', 'is', 'a', 'list:nItem', '1'] 
0931:~/mypy$ python echo_argv.py "Here is a list:\nItem 1 " 
['echo_argv.py', 'Here is a list:\\nItem 1 '] 
0931:~/mypy$ python echo_argv.py "Here is a list:\\nItem 1 " 
['echo_argv.py', 'Here is a list:\\nItem 1 '] 

​​對待是argv作爲一個字符串列表。它對這些字符串沒有任何影響,至少不會使用默認參數Nonetype參數。

0

正如@hpaulj指出的那樣,您的問題源於shell和sys.argv的工作方式。你的選擇是用你得到的轉義字符處理字符串。

請看SO上的這個答案: Process escape sequences in a string in Python 。基本上,使用string_escapeunicode_escape來處理字符串。這比手工處理你的字符串要好。