我创建了这个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'
我真的不明白这里怎么了。据我所知,字符串中没有换行符
如果将命令行的创建更改为此(removedestf
),问题仍然存在:
cmd = '' + m + ' ' + flags + ' ' + url_prefix+url + ' ' + ' ' + root+'/'+dest
但有了这个(也去掉一个空格),它就可以工作了:
cmd = '' + m + ' ' + flags + ' ' + url_prefix+url + ' ' + root+'/'+dest
如果我用' '
替换' '
,它将再次停止工作。但是当我直接在shell中输入字符串时,它甚至可以使用双空格
那么这里到底发生了什么?我可以利用上面的发现快速解决问题,但我觉得这以后会让我难受的。那么我到底错过了什么?我需要destf
参数的原因是,当我使用wget
时,它被设置为-P
,并且可能是其他命令的其他参数
感谢巴尔马的回答,解决了这个问题。当我出去吃午饭时,我意识到了问题所在
当一个程序被执行时,它会查找一个传统上称为
argv
的变量,它基本上是一个字符串数组。shell通常负责将字符串转换为字符串数组,因此如果调用此命令:然后,shell将字符串解析为:
但如果采用我所使用的方法,结果会是:
所以这根绳子没有问题。问题是绕过了shell完成的转换。但是用
.split()
代替.split(' ')
解决了这个问题它不是在抱怨字符串中的换行符。错误消息有多行,换行符是行之间的分隔符
意外参数是
'/tmp/test'
之前的空字符串''
,因为destf
是空的使用
.split(' ')
时,多个空格不会合并到单个分隔符中。所以当你这么做的时候结果是
而不是
如果希望将多个空格合并为一个分隔符,请使用
.split()
而不是.split(' ')
相关问题 更多 >
编程相关推荐