Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to update global variable in python

In python, i have a function that returns a list of the latest links(to folders) on a website. I also have another function that downloads the latest files from those folders. I plan to run this script everyday. I have a global list with the folder links that the download function accesses everytime it runs for the latest folders. I want to update that global list every five days and keep it static for the next 5 days i run the code until it updates again.

Its sort of like this:

list = ["link1", "link2",...]

def update():
  #code to update list
  return list

def download(list):
  #code to download from links

So I want the update function to run every 5 days(I know how to do that) and the download function to run everyday. So how can i keep the list returned from update() static as the global list until it is updated again?

EDIT: Let me try to clarify:

I run this on a monday:

list = ["link1", "link2"]

def update():
  #code to update list
  return list #--> list = ["link1", "link2", "link3"]

def download(list):
  #code to download from links

this worked fine, list was updated and used in download().

I run this on a Tuesday:

list = ["link1", "link2"]
#update() won't run today, only runs every 5 days
def update():
  #code to update list
  return list #--> list = ["link1", "link2", "link3"]

def download(list):
  #code to download from links

I restarted my code, but now list doesnt have link3 from monday. How do i keep link3 in the list for the next 5 days until i update list again?

Thanks

like image 463
Vaibhav Aggarwal Avatar asked Jun 25 '13 21:06

Vaibhav Aggarwal


Video Answer


2 Answers

Use global statement. But there's no need of global for mutable objects, if you're modifying them in-place.

You can use modules like pickle to store your list in a file. You can load the list when you want to use it and store it back after doing your modifications.

lis = ["link1", "link2",...]

def update():
  global lis
  #do something
  return lis

Pickle example:

import pickle
def update():
  lis = pickle.load( open( "lis.pkl", "rb" ) ) # Load the list
  #do something with lis                     #modify it 
  pickle.dump( lis, open( "lis.pkl", "wb" ) )  #save it again

For better performance you can also use the cPickle module.

More examples

like image 123
Ashwini Chaudhary Avatar answered Sep 21 '22 07:09

Ashwini Chaudhary


Normal declaration of the variable will make it local.
Use global keyword to make it render as global.

Just write the list to a file and access it read it from there later.

If you don't want to self run the code you can use cron-job to do it for you.

def read_file(filename):
    f = open(filename).read().split()
    lis = []
    for i in f:
            lis.append(i)
    return lis 

def write_file(filename,lis):
        f = open(filename,"w")
        for i in lis:
                f.write(str(i)+'\n')
like image 20
rocker_raj Avatar answered Sep 24 '22 07:09

rocker_raj