我尝试使用以下代码通过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代码考虑他们应该做同样的事情。
答案 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会根据空格将命令拆分为标记,除非您引用它的一部分。所以你的命令行最终会分成三个标记:
ssh
gcw8@cli.globusonline.org
transfer -s 3 -- ep1#path/to/dir/ ep2#end/point/ -r
所以这正是您需要传递给subprocess.Popen()
。