【问题标题】:subprocess.Popen producing different output than bashsubprocess.Popen 产生与 bash 不同的输出
【发布时间】:2015-08-10 18:30:17
【问题描述】:

我正在尝试使用以下代码通过 python 进行 Globus 辅助文件传输:

get_task_id = subprocess.Popen(['ssh','gcw8@cli.globusonline.org','"transfer','-s','3','--','ep1#path/to/dir/','ep2#end/point/','-r"'],stdout=subprocess.PIPE)

产生错误:

Command 'transfer -s 3 -- ep1#path/to/dir/ ep2#end/point -r' not found.  Type 'help' for help.

考虑到我可以成功运行,这很奇怪:

ssh gcw8@cli.globusonline.org "transfer -s 3 -- ep1#path/to/dir/ ep2#end/point/ -r"

我理解为在功能上等同于上面的 python 代码。我意识到 Globus 传输是深奥的,大多数人不会熟悉给出的命令,所以我想强调一下,我的问题更多是关于为什么我的 python 代码产生与我的 bash 代码不同的输出,因为它们应该是做同样的事情。

【问题讨论】:

  • 一些 Globus 用户最近偶然发现了这一点,所以我想确保他们知道我们不鼓励使用 subprocess + CLI 来编写 python 脚本。在过去的一年里,我们一直在为此扩展我们的python SDK

标签: python bash subprocess popen


【解决方案1】:

这个命令:

subprocess.Popen(['ssh','gcw8@cli.globusonline.org',
  '"transfer','-s','3','--','ep1#path/to/dir/','ep2#end/point/',
  '-r"'],stdout=subprocess.PIPE)

不等于:

ssh gcw8@cli.globusonline.org "transfer -s 3 -- ep1#path/to/dir/ ep2#end/point/ -r"

您的subprocess.Popen 语句中有一些奇怪的引号。我想你想要,简单地说:

subprocess.Popen(['ssh', 'gcw8@cli.globusonline.org', 
  'transfer -s 3 -- ep1#path/to/dir/ ep2#end/point/ -r'])

请记住,shell 会根据空格将您的命令拆分为标记,除非您引用其中的一部分。所以你的命令行最终会被分成三个标记:

  1. ssh
  2. gcw8@cli.globusonline.org
  3. transfer -s 3 -- ep1#path/to/dir/ ep2#end/point/ -r

所以这正是您需要传递给subprocess.Popen() 的内容。

【讨论】:

  • 哦,有趣的是,我不知道如果一部分在引号中,它不会被空格分割。这是有道理的,谢谢!
  • 是的。例如,考虑 shell 命令 for word in "this is a test"; do echo $word; donefor word in this is a test; do echo $word; done 的输出。
  • @GWarner: Popen() 默认情况下不运行 shell,因此参数按原样传递(在 POSIX 上)。除了不拆分空格之外,它不解释 shell 变量,例如,$$ 被逐字传递给子进程。无关:您可以使用output = subprocess.check_output([...]) 而不是显式调用Popen(..,stdout=PIPE)
  • @J.F.Sebastian 如果你设置shell=TRUE,它会正确解释shell变量吗?
  • 如果你设置了shell=True,那么它会将字符串(不是列表)逐字传递给shell,shell会做任何shell做的事情。基本上,你最终会得到sh -c "your command here"
猜你喜欢
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多