epx
epx

Reputation: 591

zip error: Invalid command arguments (cannot write zip file to terminal)

I am learning the book A Bite of Python. After typing in the example in the book

import os
import time

# 1. The files and directories to be backed up are
# specified in a list.
# Example on Windows:
# source = ['"C:\\MY Documents"', 'C:\\Code']
# Example on Mac OS X and Linux:
source = ['/home/username/Downloads/books']
# Notice we had to use double quotes inside the string
# for  names with spaces in it.

# 2. The backup must be stored in a 
# main backup directory
# Example on Windows:
# target_dir = 'E:\\Backup'
# Example on Mac OS X and Linux:
target_dir = '/home/username/Downloads/backup'
# Remember to change this to which folder you will be using

# 3. The files are backed up into a zip file.
# 4. The name of the zip archive is the current date and time
target = target_dir + os.sep + \
        time.strftime('%Y%m%d%H%M%S') + '.zip'

# Create target directory if it is not present
if not os.path.exists(target_dir):
    os.mkdir(target_dir)    # make directory

# 5. We use the zip commond to put the files in a zip archive
zip_command = "zip - r {0} {1}".format(target, ' '.join(source))

# Run the backup
print "Zip command is:"
print zip_command
print "Running:"
if os.system(zip_command) == 0:
    print 'Successful backup to', target
else:
    print 'Backup FALIED'

I goe a message zip error: Invalid command arguments (cannot write zip file to terminal) I can not figure out where goes wrong, I type in the same code in this book. Anyone knows why this happen?

Upvotes: 1

Views: 12521

Answers (1)

Anand S Kumar
Anand S Kumar

Reputation: 90929

The issue is in the zip command you are creating , there is an extra space between - and r . Example -

zip_command = "zip - r {0} {1}".format(target, ' '.join(source))
                    ^
Notice the extra space

There should be no space between - and r. Example -

zip_command = "zip -r {0} {1}".format(target, ' '.join(source))

Also, I would like to suggest that, it would be better to use subprocess.call() rather than os.system , providing it a list of arguments for the command. Example -

import subprocess
zip_command = ['zip','-r',target]
for s in source:
    zip_command.append(s)
subprocess.call(zip_command)

It would have been easier to see the error this way.

Upvotes: 5

Related Questions