Проблема с subprocess.call

В моем текущем рабочем каталоге у меня есть каталог ROOT/ с некоторыми файлами внутри.

Я знаю, что могу выполнить cp -r ROOT/* /dst и у меня нет проблем.

Но если я открою консоль Python и напишу следующее:

import subprocess
subprocess.call(['cp', '-r', 'ROOT/*', '/dst'])

Это не работает!

У меня такая ошибка: cp: cannot stat ROOT/*: No such file or directory

Вы можете помочь мне?


person Community    schedule 08.09.2009    source источник
comment
Для этого примера вам, вероятно, следует просто использовать shutil.copytree, что точно что (рекурсивное копирование каталогов).   -  person naught101    schedule 10.05.2012


Ответы (4)


Просто наткнулся на это, пытаясь сделать что-то подобное.

* не будет расширен до имен файлов

В яблочко. Если вы посмотрите на справочную страницу cp, вы можете вызвать ее с любым количеством исходных аргументов, и вы можете легко изменить порядок аргументов с помощью переключателя -t.

import glob
import subprocess
subprocess.call(['cp', '-rt', '/dst'] + glob.glob('ROOT/*'))
person chetbox    schedule 18.02.2011
comment
На самом деле, я думаю, что это должно быть что-то вроде subprocess.call(['cp', '-rt', '/dst'] + glob.glob('ROOT/*')), так как glob возвращает список. - person Faheem Mitha; 16.05.2011

Пытаться

subprocess.call('cp -r ROOT/* /dst', shell=True)

Обратите внимание на использование здесь одной строки, а не массива.

Или создайте собственную реализацию с помощью listdir и копировать

person Alice Purcell    schedule 08.09.2009
comment
Да, это работает... И я думаю, что это точно так же, как os.system... Это правильно? - person ; 08.09.2009
comment
Я не хочу использовать shell=True, есть ли другой способ? - person Rahul; 07.11.2011
comment
@Rahul: попробуйте docs.python.org/library/glob.html (и извините за поздний ответ!) - person Alice Purcell; 25.08.2012

* не будет расширен до имен файлов. Это функция оболочки. Здесь вы на самом деле хотите скопировать файл с именем *. Используйте subprocess.call() с параметром shell=True.

person Community    schedule 08.09.2009
comment
Верно! Это был Попен(). Извиняюсь. - person ; 08.09.2009
comment
Не думаете ли вы, что я мог бы просто использовать: os.system('cp -r ROOT/* /dst') Кажется, это работает... - person ; 08.09.2009
comment
Возможно, вы можете использовать модуль glob для создания списка файлов, которые вы хотите скопировать, и передать имена файлов в subprocess.call(). - person ; 08.09.2009
comment
os.system() фактически выполняет команду через подоболочку. Затем расширение имени файла выполняется оболочкой. - person ; 08.09.2009
comment
Старый вопрос, но очень полезный для подобной ошибки в Windows. Применяется то же ограничение — *.* не расширяется, пока вы не установите shell=True. - person JDM; 30.07.2013

Введите команду в виде списка вместо строки + списка.

Следующие две команды одинаковы: -

First Command:-
test=subprocess.Popen(['rm','aa','bb'])

Second command:-
list1=['rm','aa','bb']
test=subprocess.Popen(list1)

Таким образом, чтобы скопировать несколько файлов, нужно получить список файлов с помощью blob, а затем добавить «cp» в начало списка и пункт назначения в конец списка и предоставить список для subprocess.Popen().

Нравиться:-

list1=blob.blob("*.py")
list1=['cp']+list1+['/home/rahul']
xx=subprocess.Popen(list1)

Это сделает работу.

person Rahul    schedule 07.11.2011