2010-06-24 8 views
1

Quelqu'un peut-il m'aider?Question FTP et python

Pourquoi il ne fonctionne pas

import ftplib 
import os 

def readList(request): 
     machine=[] 
     login=[] 
     password=[] 
     for line in open("netrc"): #read netrc file 
      old=line.strip() 
      line=line.strip().split() 
      if old.startswith("machine"): machine.append(line[-1]) 
      if old.startswith("login"): login.append(line[-1]) 
      if old.startswith("password"): password.append(line[-1]) 
      connectFtp(machine,login,password) 

def connectFtp(machine,login,password): 
    for i in range(len(machine)): 
      try: 
      ftp = ftplib.FTP(machine[i]) 
      print 'conected to ' + machine[i] 
      ftp.login(login[i],password[i]) 
      print 'login - ' + login[i] + ' pasword -' + password[i] 
      except Exception,e: 
      print e 
      else: 
     ftp.cwd("PublicFolder") 
    print 'PublicFolder' 

def upload(filename, file): 
     readList() 
      ext = os.path.splitext(file)[1] 
      if ext in (".txt", ".htm", ".html"): 
      ftp.storlines("STOR " + filename, open(file)) 
      else: 
      ftp.storbinary("STOR " + filename, open(file, "rb"), 1024) 
      print 'success... yra' 

upload('test4.txt', r'c:\example2\media\uploads\test4.txt')` 

Quand il était ensemble, il travaillait. Mais quand je le sépare de fonctions quelque chose s'est passé, je ne comprends pas quoi.

+1

vos empreintes sont fausses pour une fois. – SilentGhost

Répondre

0

(En dehors des problèmes d'indentation horribles, qui sont probablement en raison de copie bâclée et coller autrement vous obtiendrez des erreurs de syntaxe jusqu'à la Wazoo de ...!) ...:

problème Scoping, d'abord: connectFtp fait local variable ftp afin que les variables disparaissent dès que la fonction est terminée. Puis upload essaie d'utiliser la variable, mais bien sûr il n'y est plus.

Ajouter un return ftp à la fin de connectFtp, un yield connectFtp au lieu d'un appel simple à la boucle en readList, et utiliser une boucle for ftp in readList(): dans upload.

+0

Que voulez-vous dire au lieu de planifier un appel? – Pol

+0

@user, je veux dire le 'connectFtp (machine, login, mot de passe)' que vous aviez l'habitude d'avoir - juste un appel, ** plain **, pas ** plan ** (modification pour corriger typo), à remplacer par 'yield connectFtp (machine, login, mot de passe)' (ainsi que les autres modifications que j'ai suggéré _et_ indentation corrige aussi bien sûr ;-). –

0

Quelque chose comme ça?

import os 


def readList(request): 
    machine = [] 
    login = [] 
    password = [] 
    for line in open("netrc"): # read netrc file 
     old = line.strip() 
     line = line.strip().split() 
     if old.startswith("machine"): machine.append(line[-1]) 
     if old.startswith("login"): login.append(line[-1]) 
     if old.startswith("password"): password.append(line[-1]) 
     yield connectFtp 


def connectFtp(machine, login, password): 
    for i in range(len(machine)): 


try: 
    ftp = ftplib.FTP(machine[i]) 
    print 'conected to ' + machine[i] 
    ftp.login(login[i], password[i]) 
    print 'login - ' + login[i] + ' pasword -' + password[i] 
except Exception, e: 
    print e 
else: 
    ftp.cwd("PublicFolder") 
    print 'PublicFolder' 
    return (ftp) 


def upload(filename, file): 
    for ftp in readList(): 
     ext = os.path.splitext(file)[1] 
    if ext in (".txt", ".htm", ".html"): 
     ftp.storlines("STOR " + filename, open(file)) 
    else: 
    ftp.storbinary("STOR " + filename, open(file, "rb"), 1024) 
    print 'success... yra' 

upload('test4.txt', r'c:\example2\media\uploads\test4.txt') 

erreur à la ligne 19 quelque chose avec try: unindent ne mathématiques aucun niveau d'indentation externe