为什么subprocess.call("""scp foo""")坏了?

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()

Mar*_*ers 6

我很确定你做的其他事情不同; 这里的三重引用并没有什么区别:

>>> 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)

但是您的示例根本不包含任何换行符.

  • @MikePennington:我知道; 关键是这是三重报价的唯一区别; 它可以很容易地在字符串文字中包含换行符,并且可以轻松地包含(单个)引号文字.*没有其他差别*,所产生的字符串是相同的.你正在咆哮着错误的树. (2认同)