Python sys.argv TypeErrors with printing function results?
Question: 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
    


Answer: 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]`

