Computer Science

# Handling arguments

When we run a Python program from the command line, we can give it arguments:

python copy_file.py this_file.txt new_file.txt

This will call the program in copy_file.py with two arguments — this_file.txt and new_file.txt. This program could then read in all the lines of this_file.txt and copy those same lines into new_file.txt.

## argv

To get the arguments into your program, Python puts them into a list called argv. To use argv, you have to:

import sys

Then you can get the arguments in sys.argv:

import sys

print('The contents of sys.argv are:')
print(sys.argv)

If you put this in a file called copy_file.py, and then run this program as above:

python copy_file.py this_file.txt new_file.txt

then this will print:

The contents of sys.argv are:
['copy_file.py', 'this_file.txt', 'new_file.txt']

Notice how the first argument in the list is the name of the program. Then the second and third (and any other) arguments come after that.

## Accessing individual arguments

import sys

input_file = sys.argv[1]
output_file = sys.argv[2]

Now if we run:

python copy_file.py this_file.txt new_file.txt

then, input_file will be equal to this_file.txt and output_file will be equal to new_file.txt.

## Copying a file

Let’s see how this would work in an entire program. Here is a program that will copy a file:

import sys

""" read all the lines in a file (it is already open) and return them
as a list """
with open(filename) as file:
return list(file)

def write_lines(filename, lines):
""" write a list of lines to the given filename (it is no open) """
with open(filename, 'w') as file:
for line in lines:
file.write(line)

def main(input_file, output_file):
""" copy the input file to the output file"""
main(sys.argv[1], sys.argv[2])
You can see that we get the two arguments and, instead of storing them in variables, immediately give them to the main() function. Now main() can call the read_lines() function to read all the lines from the input_file, and then write_lines() to write the list of lines into the output_file.