Python:用 ssh 连接替换 shell 管道
Python: replacing shell pipeline with an ssh connection
我有以下不错的 bash 命令:
cat SomePythonScript.py | ssh remote_machine 'cat - | python'
效果很好,我想写在 Python 中。我尝试使用 'subprocess' 但没有走那么远。有人能帮我吗 ?
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]
如果有任何帮助、建议、建议、解释解决方案,我将非常高兴...提前谢谢
首先,不值得复制 useless use of cat 即使您想要管道的其余部分。
其次,值得注意的是,尽管您包含了完全没有意义的 cat
命令,但您 省略了 唯一实际执行某些操作的命令 - 两次尝试都没有运行 ssh
完全没有。
编辑供将来参考 - 由于接受的答案是 still 沉迷于 cat 的相同无用用途,代码应该如下所示:
from subprocess import PIPE , Popen
p = Popen(["ssh", "remote_machine", "python"],
stdin=open("SomePythonScript.py",'r'), stdout=PIPE)
output = p.communicate()[0]
并且这个是原始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 -
只是将其标准输入复制到标准输出,因此您可以完全省略它
您使用 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]
我有以下不错的 bash 命令:
cat SomePythonScript.py | ssh remote_machine 'cat - | python'
效果很好,我想写在 Python 中。我尝试使用 'subprocess' 但没有走那么远。有人能帮我吗 ?
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]
如果有任何帮助、建议、建议、解释解决方案,我将非常高兴...提前谢谢
首先,不值得复制 useless use of cat 即使您想要管道的其余部分。
其次,值得注意的是,尽管您包含了完全没有意义的 cat
命令,但您 省略了 唯一实际执行某些操作的命令 - 两次尝试都没有运行 ssh
完全没有。
编辑供将来参考 - 由于接受的答案是 still 沉迷于 cat 的相同无用用途,代码应该如下所示:
from subprocess import PIPE , Popen
p = Popen(["ssh", "remote_machine", "python"],
stdin=open("SomePythonScript.py",'r'), stdout=PIPE)
output = p.communicate()[0]
并且这个是原始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 -
只是将其标准输入复制到标准输出,因此您可以完全省略它
您使用 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]