2016-03-23 17 views
2

Bazı garipliklerle, ayarlandıktan sonra diğer işlevlerde erişilemeyen bir değişkenle karşılaşıyorum. Bu beklendiği gibi wget süreci başladıPython değişken kapsamı, komut dosyasında

from ingest.task import html 
web_url = 'https://www.gnu.org/software/wget/manual/html_node/index.html' 
ingest = html.download.delay(web_url, 54321) 

aracılığıyla

base_path = '' 

@app.task(bind=True) 
def status(self): 
    """ 
    returns the count of files downloaded and the timestamp of the most recently downloaded file 
    """ 

    num_count = 0 
    latest_timestamp = '' 
    for root, _, filenames in os.walk(base_path): 
     for filename in filenames: 
      file_path = root + '/' + filename 
      file_timestamp = datetime.fromtimestamp(os.path.getctime(file_path)) 
      if latest_timestamp == '' or file_timestamp > latest_timestamp: 
       latest_timestamp = file_timestamp 
      num_count += 1 

@app.task(bind = True) 
def download(self, url='', cl_id=-1): 
    if len(url) == 0 or cl_id < 0: 
     return None 

    base_path = settings.WGET_PATH + str(cl_id) 

    log_paths = { 
     'output' : wget_base_path + '/out.log', 
     'rejected' : wget_base_path + '/rejected.log' 
    } 

    create_files(log_paths) 
    wget_cmd = 'wget -prc --convert-links --html-extension --wait=3 --random-wait --no-parent ' \ 
        '--directory-prefix={0} -o {1} --rejected-log={2} {3}'.\ 
     format(wget_base_path, log_paths['output'], log_paths['rejected'], url) 

    subprocess.Popen(wget_cmd, shell = True) 

Ben diyoruz html.py adında bir Kereviz görev dosyasıdır. Ancak set geçmez dosyanın üst kısmında base_path parametre, bu yüzden download sonra çağrılan status rağmen

status = html.status.delay() 

base_path değişken boş bir dize yoluyla status çağırdığınızda. Bunun nedeni, bu görevlerin bir sınıfa benzer bir senaryoda olması. Bu hat

base_path = settings.WGET_PATH + str(cl_id) 

sadece isim base_path ile yerel bir değişken oluşturur Çünkü onların fonksiyonu download yılında

cevap

4

. Bunu önlemek için base_path bildirimini global olarak bildirmeniz gerekir. Örneğin:

Python docs itibaren
@app.task(bind = True) 
def download(self, url='', cl_id=-1): 
    if len(url) == 0 or cl_id < 0: 
     return None 

    global base_path 
    base_path = settings.WGET_PATH + str(cl_id) 
... 

: aranır

  • içteki kapsamı,: yürütülmesi sırasında herhangi bir zamanda

    , kimin ad doğrudan ulaşılabilir en az üç iç içe kapsam vardır ilk olarak,

  • yerel adlarını içeren, en yakın kapsam ile başlayan, yerel olmayan, ancak aynı zamanda genel olmayan isimler
  • sonraki ve son kapsamı
  • dıştaki kapsam (en son aranır) yerleşik içeren isimlerin

bir isim küresel ilan edilirse ad, sonra tüm referanslar olduğu andaki modülün global isimleri içeriyor ve ödevler, modülün genel adlarını içeren orta kapsama doğrudan gider. Aksi takdirde, en içteki kapsam dışında bulunan tüm değişkenler salt okunurdur (bu tür bir değişkene yazma girişimi, en içteki kapsamda, aynı adlı dışsal değişkeni değiştirmeden yeni bir yerel değişken oluşturacaktır).

+0

Hmm, ok. Açıklama için teşekkürler. Java'nın bir başka örneği Python ile beni heyecanlandırıyor. – Jason

İlgili konular