Проблема с 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)
Он выполнит эту работу.