2010-10-19 4 views

Répondre

7

Jetez un oeil au code source de shutil.copytree, l'adapter et de l'utilisation:

def copytree(src, dst, symlinks=False, ignore=None): 
    """Recursively copy a directory tree using copy2(). 

    The destination directory must not already exist. 
    If exception(s) occur, an Error is raised with a list of reasons. 

    If the optional symlinks flag is true, symbolic links in the 
    source tree result in symbolic links in the destination tree; if 
    it is false, the contents of the files pointed to by symbolic 
    links are copied. 

    The optional ignore argument is a callable. If given, it 
    is called with the `src` parameter, which is the directory 
    being visited by copytree(), and `names` which is the list of 
    `src` contents, as returned by os.listdir(): 

     callable(src, names) -> ignored_names 

    Since copytree() is called recursively, the callable will be 
    called once for each directory that is copied. It returns a 
    list of names relative to the `src` directory that should 
    not be copied. 

    XXX Consider this example code rather than the ultimate tool. 

    """ 
    names = os.listdir(src) 
    if ignore is not None: 
     ignored_names = ignore(src, names) 
    else: 
     ignored_names = set() 

    os.makedirs(dst) 
    errors = [] 
    for name in names: 
     if name in ignored_names: 
      continue 
     srcname = os.path.join(src, name) 
     dstname = os.path.join(dst, name) 
     try: 
      if symlinks and os.path.islink(srcname): 
       linkto = os.readlink(srcname) 
       os.symlink(linkto, dstname) 
      elif os.path.isdir(srcname): 
       copytree(srcname, dstname, symlinks, ignore) 
      else: 
       copy2(srcname, dstname) 
      # XXX What about devices, sockets etc.? 
     except (IOError, os.error), why: 
      errors.append((srcname, dstname, str(why))) 
     # catch the Error from the recursive copytree so that we can 
     # continue with other files 
     except Error, err: 
      errors.extend(err.args[0]) 
    try: 
     copystat(src, dst) 
    except OSError, why: 
     if WindowsError is not None and isinstance(why, WindowsError): 
      # Copying file access times may fail on Windows 
      pass 
     else: 
      errors.extend((src, dst, str(why))) 
    if errors: 
     raise Error, errors 
2

vous avez juste besoin copytree avec le nom correct (ou même nom)

shutil.copytree("/path/from_dir","/destination/from_dir") 
+0

ce n'est pas la même chose, je veux copier le contenu du répertoire, pas le répertoire –

2
import glob 
import subprocess 

subprocess.check_call(["cp", "-rt", "to_dir"] + glob.glob("from_dir/*")) 

Parfois, c'est sympa de tout faire directement en Python. là encore, il est souvent plus agréable d'appeler simplement la commande que vous savez contrôler et connaître.

Je ne hésite pas à réécrire cette si lorsque les besoins changent, mais jusque-là, il est court et facile à lire  -  plus de temps est mieux dépensé sur de plus gros problèmes. Un bon exemple de la façon dont ils pourraient changer signale une erreur: vous avez rien dit à ce sujet, mais je ne serais pas la sortie analyse pas cp une fois ce qui est nécessaire.

+0

Il faut aussi mentionner que 'cp' pourrait générer une sortie, que vous ne voulez pas. Pensez à envoyer stdout/stderr à '/ dev/null'. – bstpierre

+0

ce qui est très semblable à ce que je fais maintenant, mais ce n'est pas portable –

+0

@wiso: Pourriez-vous mettre à jour la question avec vos plates-formes/environnements cibles? –