Mik*_*ton 0 python shell subprocess os.system
成功:
>>> scp_cmd = r"sudo scp -i /home/backup/.ssh/id_rsa /opt/backups/*conf backup@a-hostname.local:/opt/backups/"
>>> subprocess.call(scp_cmd, shell=True)
1eadmin1.conf 100% 83KB 83.5KB/s 00:00
1stflr_1.conf 100% 2904 2.8KB/s 00:00
>>> scp_cmd = """sudo scp -i /home/backup/.ssh/id_rsa /opt/backups/*conf backup@a-hostname.local:/opt/backups/"""
>>> os.system(scp_cmd)
1eadmin1.conf 100% 83KB 87.3KB/s 00:00
1stflr_1.conf 100% 2904 3.4KB/s 00:00
Run Code Online (Sandbox Code Playgroud)
失败:
>>> scp_cmd = r"""sudo scp -i /home/backup/.ssh/id_rsa /opt/backups/*conf backup@a-hostname.local:/opt/backups/"""
>>> subprocess.call(scp_cmd, shell=True)
/opt/backups/*conf: No such file or directory
1
>>> subprocess.call(scp_cmd.split(' '))
/opt/backups/\*conf: No such file or directory
1
>>>
>>> subprocess.call(shlex.split(scp_cmd))
/opt/backups/*conf: No such file or directory
1
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么三重引号在我使用时失败subprocess.call(),但在我使用时通过os.system().为什么在处理三重引用的字符串之间subprocess.call()和之间存在差异os.system()?
我很确定你做的其他事情不同; 这里的三重引用并没有什么区别:
>>> a = r"sudo scp -i /home/backup/.ssh/id_rsa /opt/backups/*conf backup@a-hostname.local:/opt/backups/"
>>> b = r"""sudo scp -i /home/backup/.ssh/id_rsa /opt/backups/*conf backup@a-hostname.local:/opt/backups/"""
>>> a == b
True
>>> b
'sudo scp -i /home/backup/.ssh/id_rsa /opt/backups/*conf backup@a-hostname.local:/opt/backups/'
>>> a
'sudo scp -i /home/backup/.ssh/id_rsa /opt/backups/*conf backup@a-hostname.local:/opt/backups/'
Run Code Online (Sandbox Code Playgroud)
使用三重引用只是指定python字符串文字的一种方法.如何指定该文字(带或不带r原始前缀,使用单引号或三引号,使用单引号'或双"引号)不会保留.
三重引用确实有所不同的是当你包含换行符时:
>>> foo = '''
... '''
>>> foo
'\n'
Run Code Online (Sandbox Code Playgroud)
但是您的示例根本不包含任何换行符.