2012-08-12 40 views
1

我一直在嘗試學習如何正確使用sys.argv,同時從命令行調用可執行文件。Python sys.argv打印函數結果的類型錯誤?

我想要在命令行傳遞文件名和參數時將函數結果打印到命令行,但是我得到一個TypeError。

到目前爲止,我有:

#! /usr/bin/env python 
import mechanize 
from BeautifulSoup import BeautifulSoup 
import sys 

def dictionary(word): 
    br = mechanize.Browser() 
    response = br.open('http://www.dictionary.reference.com') 
    br.select_form(nr=0) 
    br.form['q'] = sys.argv 
    br.submit() 
    definition = BeautifulSoup(br.response().read()) 
    trans = definition.findAll('td',{'class':'td3n2'}) 
    fin = [i.text for i in trans] 
    query = {} 
    for i in fin: 
     query[fin.index(i)] = i 
    return query 

print dictionary(sys.argv) 

當我把這叫做:

./this_file.py 'pass' 

我離開我與此錯誤消息:

Traceback (most recent call last): 
    File "./hot.py", line 20, in <module> 
    print dictionary(sys.argv)  
    File "./hot.py", line 10, in dictionary 
    br.form['q'] = sys.argv 
    File "/usr/local/lib/python2.7/dist-packages/mechanize/_form.py", line 2782, in __setitem__ 
    control.value = value 
    File "/usr/local/lib/python2.7/dist-packages/mechanize/_form.py", line 1217, in __setattr__ 
    raise TypeError("must assign a string") 
TypeError: must assign a string 

回答

4

隨着

br.form['q'] = sys.argv

您正在分配一個字符串列表這裏是而不是的一個字符串。

>>> type(sys.argv) 
<type 'list'> 
>>> type(sys.argv[0]) 
<type 'str'> 
>>> 

你想確定一個特定的字符串通過索引分配。

最有可能它會是索引1給你什麼你的帖子(並且因爲索引0是腳本的名稱)。因此,也許

br.form['q'] = sys.argv[1]

會爲你做。當然,它也可能是另一個索引,取決於您的特定應用/需求。

注意@Dougal在下面的有用註釋中注意到,該函數中的函數參數word未被使用。你正在呼叫你的dictionary函數發送它sys.argv,然後應該參考word裏面的函數。該類型不會僅更改在函數內引用命令行參數的名稱。 word的想法很好,因爲它避免使用全局變量。如果您提到使用全局變量(並非真正鼓勵),則建議刪除word,因爲它會讓人感到困惑)。

所以,你的說法應該認真閱讀

br.form['q'] = word[1]

+0

捷爾感謝您耐心等待,並回答我的問題。我應該強調一點,我沒有使用sys.argv。我以爲kwargs使用的列表和元組不是argv。 – tijko 2012-08-12 21:51:48

+1

@tijko沒問題。 *沒有人*出生在這裏知道Python(或其他任何東西:)從你以前的問題和錯誤消息,我懷疑這條線是問題。我希望這能解決你的問題。 – Levon 2012-08-12 21:53:02

+0

對,並非常感謝。它解決了這個問題,我明白爲什麼! :D – tijko 2012-08-12 21:54:00

相關問題