2010-10-19 1 views

ответ

7

Посмотрите на исходный код shutil.copytree, адаптировать и использовать:

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

вам просто нужно copytree с правильным именем (или же именем)

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

это не то же самое, я хочу, чтобы скопировать содержимое каталога, а не каталог –

2
import glob 
import subprocess 

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

Иногда приятно делать все непосредственно в Python; то опять же, гораздо лучше просто вызвать команду, которую вы знаете, как управлять и знать работы.

я бы не колеблясь, чтобы переписать если при изменении требований, но до тех пор, это не короткий и читаемый   - более   время лучше потратить на большие проблемы. Хорошим примером того, как они могут измениться, является сообщение об ошибке: вы ничего не сказали об этом, но я бы не разгладил вывод cp, как только это потребуется.

+0

Также стоит отметить, что 'cp' может генерировать выходной сигнал, который вы не можете. Рассмотрим отправку stdout/stderr в '/ dev/null'. – bstpierre

+0

это очень похоже на то, что я делаю сейчас, но это не портативный –

+0

@wiso: Могли бы вы обновить вопрос с вашей целевой платформы/сред? – 2010-10-19 17:27:10