subprocess.Popen生成不同于bash的输出

时间:2015-08-10 18:30:17

标签: python bash subprocess popen

我尝试使用以下代码通过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代码考虑他们应该做同样的事情。

1 个答案:

答案 0 :(得分:4)

此命令:

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
  4. 所以这正是您需要传递给subprocess.Popen()