2014-02-28 75 views
1

我想創建dft.ba URL shortener命令行界面使用python的argparse和調用我的python腳本.profile中的函數。這是代碼在我的python腳本營業結束:自定義終端命令與argparse和.profile

parser = argparse.ArgumentParser(description='Shortens URLs with dft.ba') 
parser.add_argument('LongURL',help='Custom string at the end of the shortened URL') 
parser.add_argument('--source','-s',help='Custom string at the end of the shortened URL') 
parser.add_argument('-c','--copy', action="store_true", default=False, help='Copy the shortened URL to the clipboard') 
parser.add_argument('-q','--quiet', action="store_true", default=False, help="Execute without printing") 
args = parser.parse_args() 
target_url=args.LongURL 
source=args.source 
print source 


query_params={'auth':'ip','target':target_url,'format':'json','src':source} 
shorten='http://dft.ba/api/shorten' 
response=requests.get(shorten,params=query_params) 
data=json.loads(response.content) 
shortened_url=data['response']['URL'] 
print data 
print args.quiet 
print args.copy 

if data['error']: 
    print 'Error:',data['errorinfo']['extended'] 
elif not args.copy: 
    if args.quiet: 
     print "Error: Can't execute quietly without copy flag" 
    print 'Link:',shortened_url 
else: 
    if not args.quiet: 
     print 'Link:',shortened_url 
     print 'Link copied to clipboard' 
    setClipboardData(shortened_url) 

,然後在.profile文件我有這樣的:

dftba(){ 
    cd ~/documents/scripts 
    python dftba.py "$1" 
} 

運行dftba SomeURL會吐出一個縮短的URL回我,但沒有當我嘗試在LongURL之前使用-s SomeSource時,它會給出error: argument --source/-s: expected one argument,之後使用時它什麼也不做,省略時給出error: too few arguments。由於某種原因,-c-q給出error: too few arguments。但是,如果我強制複製,我使用的剪貼板功能複製到剪貼板功能的效果非常好。

我非常感覺這是我的方式,所以如果我犯了一些明顯的錯誤,我很抱歉。我感覺問題在我的bash腳本中,我只是不知道在哪裏。

任何幫助將不勝感激。謝謝。

回答

1

讓我們只專注於解析器做什麼

parser = argparse.ArgumentParser(description='Shortens URLs with dft.ba') 
parser.add_argument('LongURL',help='Custom string at the end of the shortened URL') 
parser.add_argument('--source','-s',help='Custom string at the end of the shortened URL') 
parser.add_argument('-c','--copy', action="store_true", default=False, help='Copy the shortened URL to the clipboard') 
parser.add_argument('-q','--quiet', action="store_true", default=False, help="Execute without printing") 
args = parser.parse_args() 
print args # add to debug the `argparse` behavior 

LongURL是總是需要一個位置參數。如果缺少,你會得到「太少的參數」的錯誤信息。

source是可選的,但在提供時必須包含參數。如果沒有給出args.source is None。正如所寫的source論點必須在LongURL之外。

args.copyargs.quiet都是布爾值;默認值是False;如果給出則爲True。 (default=False參數是不需要的。)

我還沒有試圖通過使用copyquiet的邏輯工作。如果LongURLsource之前出現問題,則不會發揮作用。

比較這些樣本:

In [38]: parser.parse_args('one'.split()) 
Out[38]: Namespace(LongURL='one', copy=False, quiet=False, source=None) 

In [41]: parser.parse_args('-s one two -c -q'.split()) 
Out[41]: Namespace(LongURL='two', copy=True, quiet=True, source='one') 

它也可以幫助看一下parse_args是解析:sys.argv[1:](如果您有關於您從.profile中得到什麼疑慮)。

+0

感謝您的回覆。出於某種原因,我省略了實際上在'-s'之後放置源的事實,所以輸入是'dftba -s SOURCE LongURL'。它仍然給出'錯誤:參數--source/-s:預期的一個參數'。在那種情況下,它永遠不會'打印參數',所以我不知道那裏發生了什麼。嘗試'-c'和'-q'會給出'錯誤:太少的參數',再次不會打印'args'。對不起,這並不是所有的帖子,當我寫這篇文章的時候,腦子有點混亂。 – Whonut

+0

檢查'sys.argv'。 ''$ 1''可能會給一個.string。 – hpaulj

+0

啊哈!我認爲這可能是這個。當我運行'dftba -q URL'時,sys.argv是[dftba.py,'-q']。當我向.profile中添加「$ 2」時,它會正確執行(它是錯誤,但它意味着這麼做)。經過一番環視後,「$ @」似乎可以滿足我的需求。這就是說,雖然'-s SOURCE'不會導致錯誤,它實際上並不_work_。我必須誤解API的文檔。謝謝您的幫助。我應該如何將此標記爲已解決? – Whonut