MrDuk MrDuk - 3 months ago 11
Python Question

Python script doesn't delete file from archive -- printed command via terminal works fine

I'm creating an archive in Python using this code:

#Creates archive using string like [proxy_16-08-15_08.57.07.tar]
proxyArchiveLabel = 'proxy_%s' % EXECUTION_START_TIME + '.tar'
log.info('Packaging %s ...' % proxyArchiveLabel)

#Removes .tar from label during creation
shutil.make_archive(proxyArchiveLabel.rsplit('.',1)[0], 'tar', verbose=True)


So this creates an archive fine in the local directory. The problem is, there's a specific directory in my archive I want to remove, due to it's size and lack of necessity for this task.

ExecWithLogging('tar -vf %s --delete ./roles/jobs/*' % proxyArchiveLabel)
# ------------
def ExecWithLogging(cmd):
print cmd
p = subprocess.Popen(cmd.split(' '), env=os.environ, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while(True):
log.info(p.stdout.readline().strip())
if(p.poll() is not None):
break


However, this seems to do basically nothing. The size remains the same. If I print
cmd
inside of the
ExecWithLogging
, and copy/past that command to a terminal in the working directory of the script, it works fine. Just to be sure, I also tried hard-coding the full path to where the archive is created as part of the
tar -vf %s --delete
command, but still nothing seemed to happen.

I do get this output in my INFO log:
tar: Pattern matching characters used in file names
, so I'm kind of thinking
Popen
is interpreting my command incorrectly somehow... (or rather, I'm more likely passing in something incorrectly).

Am I doing something wrong? What else can I try?

Answer

You may have to use the --wildcards option in the tar command, which enables pattern matching. This may well be what you are seeing in your log, be it somewhat cryptically.