【发布时间】:2014-02-21 04:57:37
【问题描述】:
我在计算机“A”上运行我的脚本。然后我通过我的脚本从计算机“B”连接到计算机“A”。我将消息发送到计算机“A”,我的脚本使用 exec() 指令运行它。
我想通过计算机“B”上的套接字查看在计算机“A”上执行我的消息的结果。
我尝试更改sys.stdout = socket_response但出现错误:“Socket object has no attribute write()”
那么,如何通过套接字连接将标准输出(print 或 exec())从计算机“A”重定向到计算机“B”?
这将是我脚本中的某种“python 解释器”。
抱歉,我无法在没有声誉的情况下回答我自己的问题
谢谢大家!
我使用@Torxed 建议我的简单方法。这是我的伪代码(只是一个例子,不是我的真实脚本)
#-*-coding:utf-8-*-
import socket
import sys
class stdout_():
def __init__(self, sock_resp):
self.sock_resp = sock_resp
def write(self, mes):
self.sock_resp.send(mes)
MY_IP = 'localhost'
MY_PORT = 31337
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("Start server")
old_out = sys.stdout
srv.bind((MY_IP, MY_PORT))
srv.listen(0)
sock_resp, addr_resp = srv.accept()
new_out = stdout_(sock_resp)
sys.stdout = new_out
#sys.stdout = sock_resp ### sock_object has no attribute 'write'
while 1:
try:
a = sock_resp.recv(1024)
exec(a)
except socket.timeout:
#print('server timeout!!' + '\n')
continue
我用 Putty 连接到脚本并发送“print 'abc'”,然后我收到了答案 'abc'。
【问题讨论】:
-
你写一个包装类怎么样,你可以把你的
sys.stdout指向它,它有一个叫做write()的函数,基本上就是这样:self.socket.send(data),一切都很好? :) -
是的,我想过,但可能有更标准的方式?
-
另外,我可能会考虑使用
subprocess.Popen()而不是exec(),因为您将能够更有效地处理命令的输入/输出。我知道没有标准的方法,希望一些大师知道:) -
@Torxed 我就是这样做的。您可能希望将您的评论变成答案。
-
是的,希望...但我必须稍微解释一下情况。我有一个“my_script”,应该可以永久使用。而且我不能总是在附近。但是我需要将变量更改为脚本而不停止它。我想——这种方式很简单,但我错了……
标签: python sockets redirect stdout