2010-10-01 63 views
6

當使用optparse時,我希望在選項後獲得整個字符串,但我只能將其中的一部分獲得到第一個空格。Python optparse和參數中的空格

例如爲:

python myprog.py --executable python someOtherProg.py 

我在 '可執行文件' 得到的是隻是 '蟒蛇'。

是否可以使用optparse解析這些行或者您是否必須使用argparse來執行此操作?

€:我已經嘗試過在「S包圍它,但進一步挖掘到的代碼後,我發現,子進程調用不能處理的參數

與命令行的字符串被塞進一個。列表 'ARGS'。

args = [self.getExecutable()] + self.getArgs().split() 

這就像

"[python D:\\\workspace\\\myprog\\\src\\\myprog.py]" 

這給了我的系統無法找到文件例外。當我使用

args[0] 

它的工作原理。但是我放棄了可執行文件的參數。

如果子進程模塊沒有首先獲取字符串,那麼它將從列表中構建一個cmdline,因此我目前無法解釋該行爲。

回答

12

您可以將它們用引號括起來,以使它們與現有代碼協同工作。

python myprog.py --executable "python someOtherProg.py" 

是否有可能使用optparse解析這樣的線或你有使用argparse辦呢?

我不知道你是否可以用optparse做到這一點,因爲我沒有真正與optparse合作過。

但我可以幫你解決​​。下面是一個簡單的例子:

#!/usr/bin/python 
import argparse, sys 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser(description = 'Demonstration of Argparse.') 
    parser.add_argument('-e', '--executable', nargs = '+', help = 'List of executables') 
    args = parser.parse_args(sys.argv[1:]) 
    print args.executable 

與用法:

[email protected]:~$ python myprog.py --executable python someOtherProg.py 
['python', 'someOtherProg.py'] 

我也建議你切換從optparseargparse。自2.7起,Optparsedeprecated

4

您看到的行爲來自於它的shell而不是python,它解析命令行並將其分離爲sys.argv的單詞。 Python由shell通過exec()啓動,argv已經被填充。

大多數shell會將空格分割爲空格,除非您通過引用或轉義不告訴它們。

行情如上所述工作。

在許多炮彈,你可以這樣做:

python myprog.py --executable python\ someOtherProg.py 

反斜槓逃逸以下的空間,而不需要引號。

+0

準備被驚呆了:Python的3.5下,一名逃脫的空間被sys.argv中轉義!在C中,我們有'傻蟒一些':'argv [1]'='「python」','argv [2]'='「some」'。 '傻'python一些'':'argv [1]'='「python some」'。和'傻蟒\ some':'argv [1]'='「python some」'。但是對於Python 3.5,我們有'silly.py python some':'argv [1]'='「python」''''''''''''''''''''''''''。 'silly.py「python some」':'argv [1]'='「python some」'。和'silly.py python \ some':'argv [1]'='「python \\」',''some「'。驚人! – Urhixidur 2016-11-04 19:43:49

4

如果你知道有多少字的參數標誌之後,你會得到,你可以修改你在optparse創建--executable選項的方式妥善處理的情況:

而不是採取一個選項標誌之後的字,你可以設置optparse解析器尋找(或更多)的話:

from optparse import OptionParser 
parser = OptionParser() 

parser.add_option("-f", "--file", action="store", dest="filename", 
         help="File to be processed.", metavar="FILE") 
parser.add_option("-e", "--executable", action="store", dest="my_exe", 
         help="Command to be executed", metavar="EXE", 
         nargs=2) 

在這個片段中,-f--file選項僅預期一個單詞並將其作爲字符串(默認值)存儲在filename變量中。

相反,-e,--executable選項因nargs=2選項而期待兩個單詞。這將導致在-e--executable標誌後面找到的兩個單詞將作爲字符串存儲在Python列表my_exe中。

查看:http://docs.python.org/library/optparse.html欲瞭解更多關於optparse的信息,請記住它已棄用2.7,有利於​​。

1

只是爲了最終確定這個答案列表,如果你不能升級到argparse。

Optparse無法處理這些情況(多個字符串)。你只能用nargs來指定特定數量的valiables,但沒有什麼比「一個或多個」更好。你需要破解它或使用不同的庫(如argparse或其他)。

+0

你能告訴我如何使用argparse來處理它嗎? w/o使用'sys.argv'我猜argparse也沒有像'parse_string'這樣的功能,而不是'parse_args',例如解析字符串有一個或多個空格'' – shahjapan 2011-08-31 08:15:21

+0

argparse也是有限的,我沒有太多的經驗:-( – lzap 2011-09-01 10:03:11

+0

看到我提供的另一個解決方案,應該與'argparse'以及'optparse '作爲獨立使用'shlex'庫。 – shahjapan 2011-09-05 08:55:54

6

我發現了另一個很好的選擇shlex - 一個簡單的類似shell的語法的詞法分析器類。

來源鏈接:How to parse a command line with regular expressions?

>>> import shlex 
>>> shlex.split('"param 1" param2 "param 3"') 
['param 1', 'param2', 'param 3'] 
>>> shlex.split('"param 1" param2 "param 3"') 
Traceback (most recent call last): 
    [...] 
ValueError: No closing quotation 
>>> shlex.split('"param 1" param2 "param 3\\""') 
['param 1', 'param2', 'param 3"']