【问题标题】:Python: replacing shell pipeline with an ssh connectionPython:用 ssh 连接替换 shell 管道
【发布时间】:2018-07-19 13:32:43
【问题描述】:

我有以下不错的 bash 命令:

cat SomePythonScript.py | ssh remote_machine 'cat - | python'

效果很好,我想用 Python 编写。我尝试了“子流程”,但没有走那么远。有人能帮我吗 ?

from subprocess import  PIPE , Popen

p1 = Popen(["cat ", "SomePythonScript.py"], stdout=PIPE)
p2 = Popen(["remote_machine"], stdin=p1.stdout, stdout=PIPE)
p3 = Popen(["cat -", "python"], stdin=p2.stdout, stdout=PIPE)

p1.stdout.close()  
p2.stdout.close()  

output = p3.communicate()[0]

我也尝试了 2 个进程/管道

from  subprocess import PIPE , Popen  
p1 = Popen([["cat", "SomePythonScript.py"], stdout=PIPE)
p2 = Popen(["remote_machine","cat", "- python"], stdin=p1.stdout,    stdout=PIPE)
p1.stdout.close() 
output = p2.communicate()[0]

我很乐意为您提供任何帮助、建议、意见、解释解决方案......提前谢谢

【问题讨论】:

标签: python subprocess pipe piping


【解决方案1】:

首先,即使您想要管道的其余部分,也不值得复制 useless use of cat

其次,值得注意的是,尽管您包含了完全没有意义的 cat 命令,但您省略了唯一实际执行某些操作的命令 - 根本没有尝试运行 ssh


编辑供将来参考 - 因为接受的答案是仍然沉迷于 cat 的相同无用用途,这就是代码应该看起来的样子:

from subprocess import  PIPE , Popen

p = Popen(["ssh", "remote_machine", "python"], 
          stdin=open("SomePythonScript.py",'r'), stdout=PIPE)
output = p.communicate()[0]

this 是最初的 shell 代码应该是这样的:

< SomePythonScript.py ssh remote_machine python

包含您的原始代码

  • p1 = Popen([["cat", "SomePythonScript.py"], stdout=PIPE)
    

    其效果与open("SomePythonScript.py",'r') 相同,但代价是运行子进程完全没有任何好处。

  • p2 = Popen(["ssh", "remote_machine", "cat - | python"], ...
    

    在远程机器上运行一个额外的冗余进程。由于cat -只是将其stdin复制到stdout,所以可以完全省略

【讨论】:

  • 首先谢谢你,第一点你是对的。没有第二只猫,bash 命令的工作方式完全相同。在第二点上,我只是错误地删除了 ssh 命令,因为我正在更改远程机器的名称。
【解决方案2】:

您使用Popen 没有任何问题。唯一的错误是您缺少ssh 命令,并且当您尝试模仿的bash 命令中只有两个进程时,您尝试运行三个进程--'cat - | python' 只是一个参数ssh 命令。

以下应该更好地模仿您的 bash 命令:

from subprocess import  PIPE , Popen

p1 = Popen(["cat", "SomePythonScript.py"], stdout=PIPE)
p2 = Popen(["ssh", "remote_machine", "cat - | python"], stdin=p1.stdout, stdout=PIPE)

p1.stdout.close()  

output = p2.communicate()[0]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    相关资源
    最近更新 更多