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
Let’s talk about how the Python script gets access to these arguments. In your Python script, you can do the following:
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
def read_lines(filename):
""" 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"""
lines = read_lines(input_file)
write_lines(output_file, lines)
# Call the main function with arguments 1 and 2 -- which should be the input file
# and 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
.