subprocess.Popen 产生与 bash 不同的输出

subprocess.Popen producing different output than bash

我正在尝试使用以下代码通过 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 代码产生与我的 [=26] 不同的输出=] 代码考虑到他们应该做同样的事情。

这个命令:

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() 的内容。