我想调用这样的命令
scp username@hostname:/dir/to/files/\{a,b,c\} /target/dir在一个命令中复制多个文件。如果将命令直接输入shell,则该命令将完美地工作。
但如果我用
import subprocess
p = subprocess.Popen(['scp', 'username@hostname:/dir/to/files/\{a,b,c\}',
'/target/dir'])
sts = os.waitpid(p.pid, 0)我知道错误了
scp: /dir/to/files/{a,b,c}: No such file or directory很明显,反斜杠不见了。如果我在Popen参数中使用双反斜杠,如
\\{a,b,c,d\\}我知道错误了
scp: /dir/to/target/\a: No such file or directory
scp: /dir/to/target/\b: No such file or directory
scp: /dir/to/target/\c\: No such file or directory如果我使用像r'\{' + r'\}'这样的原始字符串,什么都不会改变
如何使用正确转义的大括号'\\{a,b,c\\}'从Python调用scp命令?
发布于 2018-02-06 14:29:32
让·弗朗索瓦·法布雷让我走上正轨:
import subprocess
p = subprocess.Popen('scp username@hostname:/dir/to/files/\{a,b,c\} /target/dir',
shell=True)
sts = p.wait()这个
shell=True争论是缺失的一点。这不是一个推荐的解决方案,但至少它是有效的。
发布于 2018-02-06 14:18:03
无法测试,但是我会删除所有的黑斜杠,因为它们只是为了保护本地机器上的外壳的扩展:
import subprocess
p = subprocess.Popen(['scp', 'username@hostname:/dir/to/files/{a,b,c}',
'/target/dir'])
sts = p.wait()还请注意,p.wait()比您执行的等待命令要好得多(更可移植!)
发布于 2018-02-06 14:37:55
不要在脚本中不必要地使用shell特性;您可以使用文本编辑器来简化输入。只需分别传递三个文件名:
p = subprocess.Popen(['scp',
'username@hostname:/dir/to/files/a',
'username@hostname:/dir/to/files/b',
'username@hostname:/dir/to/files/c',
'/target/dir'])或者,让Python为您构建文件列表。
file_list = ['username@hostname:/dir/to/files/%s' % (s,)
for f in ['a', 'b', 'c']]
p = subprocess.Popen(['scp'] + file_list + ['/target/dir'])https://stackoverflow.com/questions/48644937
复制相似问题