tijko
tijko

Reputation: 8302

Python sys.argv TypeErrors with printing function results?

I have been trying to learn how to use sys.argv properly, while calling an executable file from the command line.

I wanted to have the functions results print to the command line when passing the filename and argument on the command line but, I get a TypeError.

So far I have:

#! /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)

When I call this:

./this_file.py 'pass'

I am left with this error message:

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

Upvotes: 1

Views: 803

Answers (1)

Levon
Levon

Reputation: 143072

With

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

you are assigning a list of strings here instead of a string.

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

You want to identify a specific string to assign via an index.

Most likely it will be be index 1 given what you have in your post (and since index 0 is the name of the script). So perhaps

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

will do for you. Of course it could be another index too, depending on your particular application/needs.

Note as @Dougal observes in a helpful comment below, the function parameter word in the function is not being used. You are calling your dictionary function sending it sys.argv and then ought to refer to word inside the function. The type doesn't change only the name that you refer to the command line args inside your function. The idea of word is good as it avoids the use of global variables. If you refer to use globals (not really encouraged) then removing word is recommended as it will be confusing to have it there).

So your statement should really read

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

Upvotes: 4

Related Questions