Я создал это mre:
import subprocess
m = 'rsync'
url = 'mirror.nsc.liu.se/CentOS/7.8.2003/'
flags = '-avHP --delete '
destf = ''
url_prefix = 'rsync://'
root = '/tmp'
dest = 'test'
cmd = m + ' ' + flags + ' ' + url_prefix+url + ' ' +destf + ' ' + root+'/'+dest
print(cmd)
print(cmd.split(' '))
proc=subprocess.run(cmd.split(' '), capture_output=True)
print(proc.stderr)
Что дает мне следующий результат:
$ python3 test.py
rsync -avHP --delete rsync://mirror.nsc.liu.se/CentOS/7.8.2003/ /tmp/test
['rsync', '-avHP', '--delete', '--bwlimit=800', 'rsync://mirror.nsc.liu.se/CentOS/7.8.2003/', '', '/tmp/test']
b'Unexpected local arg: \nIf arg is a remote file/dir, prefix it with a colon (:).\nrsync error: syntax or usage error (code 1) at main.c(1368) [Receiver=3.1.3]\n'
Я действительно не понимаю, что здесь не так. Насколько я знаю, в строке нет новых строк.
Если я изменю создание командной строки на это (удалите destf
), проблема все равно останется:
cmd = '' + m + ' ' + flags + ' ' + url_prefix+url + ' ' + ' ' + root+'/'+dest
Но с этим (также удалите один пробел) он работает:
cmd = '' + m + ' ' + flags + ' ' + url_prefix+url + ' ' + root+'/'+dest
Если я заменю ' '
на ' '
, он снова перестанет работать. Но когда я ввожу строку прямо в оболочку, она работает даже с двойными пробелами.
Так что же здесь на самом деле происходит? Я мог бы использовать свои выводы выше, чтобы быстро исправить это, но мне кажется, что это укусит меня позже. Так что же мне здесь на самом деле не хватает? Причина, по которой мне нужен параметр destf
, заключается в том, что он установлен на -P
, когда я использую wget
, и, возможно, это может быть что-то еще для другой команды.