Вызов mv из Python Popen с подстановочными знаками - PullRequest
3 голосов
/ 17 сентября 2011

Я не могу заставить команду 'mv' работать с Python subprocess.Popen с подстановочным знаком.

код:

def moveFilesByType(source, destination, extension):
    params = [] 
    params.append("mv")
    params.append(source + "/*." + extension)       
    params.append(destination + "/") 

    print params

    pipe = subprocess.Popen(params, shell=True, stdout=PIPE)
    result, err = pipe.communicate()

    return result

Выход из print params:

    ['mv', '/full_path_to_folder_source/*.nib', '/full_path_to_folder_target/']

Пути здесь сокращены только для удобства чтения, но я заверяю, что они действительны. Вызов этой же команды из терминала работает, но вызов в python дает стандартное сообщение о неправильном использовании mv:

usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

Я прочитал, что для работы подстановочных знаков мне понадобится параметр shell=True в вызове Popen, который присутствует. Есть идеи, почему это не работает? Удаление shell=True приводит к тому, что звездочки считаются жесткими литералами, как и ожидалось.

Ответы [ 3 ]

9 голосов
/ 17 сентября 2011

Использовать строку вместо массива:

params = "mv /full_path_to_folder_source/*.nib /full_path_to_folder_target/"

Когда вы задаете аргументы через форму массива, аргумент '/full_path_to_folder_source/*.nib' передается в mv. Вы хотите заставить bash расширить аргумент, но Popen не будет передавать каждый аргумент через оболочку.

3 голосов
/ 17 сентября 2011

Вы можете сделать это без запуска нового процесса, используя модули shutil и glob:

import glob
import shutil

def moveFilesByType(source, destination, extension):
    for path in glob.glob(source + "/*." + extension):
        shutil.move(path, destination)
1 голос
/ 17 сентября 2011

Вам не нужно использовать подпроцесс для этого, посмотрите shutil.copytree

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...