0

成功:

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

失敗:

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

を使用すると三重引用符が失敗するのにsubprocess.call()、 を使用すると成功する理由がわかりませんos.system()。三重引用符で囲まれた文字列を処理する場合subprocess.call()とで違いがあるのはなぜですか?os.system()

4

2 に答える 2

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/'

トリプルクォートを使用することは、Python文字列リテラルを指定する1つの方法にすぎません。そのリテラルをどのように指定したか(r生のプレフィックスの有無にかかわらず、一重引用符または三重引用符を使用し、一重引用符'または二重"引用符を使用)は保持されません。

トリプルクォート違いを生むのは、改行を含める場合です。

>>> foo = '''
... '''
>>> foo
'\n'

しかし、あなたの例には改行がまったく含まれていません。

于 2012-10-11T19:55:09.510 に答える