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

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

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

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

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

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

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

Можете ли вы мне помочь?

Ответ 1

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

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

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

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

Ответ 2

Try

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

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

Как: -

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

Он выполнит эту работу.