1

コマンドラインから実行可能ファイルを呼び出しながら、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

1 に答える 1

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]

于 2012-08-12T21:46:28.067 に答える