首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Python的子进程调用scp不使用filelist \{a,b,c}

从Python的子进程调用scp不使用filelist \{a,b,c}
EN

Stack Overflow用户
提问于 2018-02-06 14:06:11
回答 4查看 5.5K关注 0票数 4

我想调用这样的命令

代码语言:javascript
复制
scp username@hostname:/dir/to/files/\{a,b,c\} /target/dir

在一个命令中复制多个文件。如果将命令直接输入shell,则该命令将完美地工作。

但如果我用

代码语言:javascript
复制
import subprocess
p = subprocess.Popen(['scp', 'username@hostname:/dir/to/files/\{a,b,c\}',
                      '/target/dir'])
sts = os.waitpid(p.pid, 0)

我知道错误了

代码语言:javascript
复制
scp: /dir/to/files/{a,b,c}: No such file or directory

很明显,反斜杠不见了。如果我在Popen参数中使用双反斜杠,如

代码语言:javascript
复制
\\{a,b,c,d\\}

我知道错误了

代码语言:javascript
复制
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命令?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-02-06 14:29:32

让·弗朗索瓦·法布雷让我走上正轨:

代码语言:javascript
复制
import subprocess
p = subprocess.Popen('scp username@hostname:/dir/to/files/\{a,b,c\} /target/dir',
shell=True)
sts = p.wait()

这个

代码语言:javascript
复制
shell=True

争论是缺失的一点。这不是一个推荐的解决方案,但至少它是有效的。

票数 2
EN

Stack Overflow用户

发布于 2018-02-06 14:18:03

无法测试,但是我会删除所有的黑斜杠,因为它们只是为了保护本地机器上的外壳的扩展:

代码语言:javascript
复制
import subprocess
p = subprocess.Popen(['scp', 'username@hostname:/dir/to/files/{a,b,c}',
                      '/target/dir'])
sts = p.wait()

还请注意,p.wait()比您执行的等待命令要好得多(更可移植!)

票数 3
EN

Stack Overflow用户

发布于 2018-02-06 14:37:55

不要在脚本中不必要地使用shell特性;您可以使用文本编辑器来简化输入。只需分别传递三个文件名:

代码语言:javascript
复制
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为您构建文件列表。

代码语言:javascript
复制
file_list = ['username@hostname:/dir/to/files/%s' % (s,)
             for f in ['a', 'b', 'c']]
p = subprocess.Popen(['scp'] + file_list + ['/target/dir'])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48644937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档