如果使用Popen启动两个python脚本,为什么我的两个python脚本之间的套接字连接断开?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如果使用Popen启动两个python脚本,为什么我的两个python脚本之间的套接字连接断开?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4662字,纯文字阅读大概需要7分钟。
内容图文
因此,我有两个非常简单的Python脚本,它们通过套接字进行通信.现在它们都在同一台Windows PC上运行.
这是controller.py:
import socket
import time
import sys
from subprocess import Popen, CREATE_NEW_CONSOLE
HOST = '192.168.1.107' # The remote host
PORT = 50557 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((HOST, PORT))
except:
Popen([sys.executable, 'driver.py'], creationflags=CREATE_NEW_CONSOLE)
time.sleep(0.2);
s.connect((HOST, PORT))
s.send(sys.argv[1])
data = s.recv(1024)
s.close()
print 'Received', repr(data)
这是driver.py:
import socket
HOST = '' # Symbolic name meaning the local host
PORT = 50557 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
while 1:
print 'Waiting for controller connection.'
conn, addr = s.accept()
print 'Connected to ', addr
while 1:
data = conn.recv(1024)
print 'Recieved ', data
if not data: break
if data == 'Q': quit()
print 'A.'
conn.send(data[::-1])
print 'B.'
print 'C.'
conn.close()
如果我打开两个cmd窗口和python< filename> .py< arg>他们都一切正常.我可以让driver.py继续运行,并一遍又一遍地运行controller.py.直到我通过发送“ Q”杀死驱动程序.
如果无法建立连接,则try / except语句将打开一个新窗口并运行driver.py.从理论上讲,这只是确保接收器在发送任何内容之前正在运行.此ALMOST可以工作,但是由于某种原因,由于我无法解释的原因,driver.py挂在第二个while循环内.这是顺序controller.py调用的输出:
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
>python controller.py FirstMsg
Received 'gsMtsriF'
>python controller.py SecondMsg
Received 'gsMdnoceS'
>python controller.py Q
Received ''
>python controller.py ThirdMsg
Received 'gsMdrihT'
>python controller.py FourthMsg
(在FourthMsg controller.py永久挂起之后)
这是来自driver.py的输出
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
>python driver.py
Waiting for controller connection.
Connected to ('192.168.1.107', 49915)
Recieved FirstMsg
A.
B.
Recieved
C.
Waiting for controller connection.
Connected to ('192.168.1.107', 49916)
Recieved SecondMsg
A.
B.
Recieved
C.
Waiting for controller connection.
Connected to ('192.168.1.107', 49917)
Recieved Q
(随即返回常规命令提示符.)用Popen创建的新窗口包含以下内容:
等待控制器连接.
已连接至(‘192.168.1.107’,49918)
收到ThirdMsg
一种.
B.
因此,在怪异的新窗口(我刚刚注意到它看起来或不像常规cmd窗口)中,程序似乎挂在data = conn.recv(1024)上.
为什么driver.py在新窗口中的行为有所不同,我该如何解决?
解决方法:
您要求使用套接字和Popen,我的回答将忽略此问题,并尝试为用例提出解决方案,如所示-网络上的远程通信.
使用套接字,很容易遇到永无止境的问题.如果您在两个端点的控制下,zeromq通信将使您的编程恢复乐趣.
您可以直接使用zeromq(如果您查看pyzmq的示例,您会发现它们确实很简短,并且在许多困难的情况下都能很好地工作),但是今天我将展示使用zerorpc库,它使远程调用更加简单.
安装zerorpc
$pip install zerorpc
写你的worker.py
def reverse(text):
""" return reversed argument """
return text[::-1]
def makebig(text):
""" turn text to uppercase letters """
return text.upper()
从命令行调用辅助方法
启动服务器提供的worker.py功能
$zerorpc --server --bind tcp://*:5555 worker
binding to "tcp://*:5555"
serving "worker"
使用服务(从命令行)
简单调用,报告可用功能
$zerorpc tcp://localhost:5555
connecting to "tcp://localhost:5555"
makebig turn text to uppercase letters
reverse return reversed argument
然后调用以下函数:
$zerorpc tcp://localhost:5555 reverse "alfabeta"
connecting to "tcp://localhost:5555"
'atebafla'
$zerorpc tcp://localhost:5555 makebig "alfabeta"
connecting to "tcp://localhost:5555"
'ALFABETA'
注意:到目前为止,我们已经编写了7行代码,并且已经能够远程调用它.
从Python代码使用
命令行实用程序zerorpc只是方便的实用程序,但是您可以自由地使用纯Python进行集成,而无需它.
从python代码client.py中使用
import zerorpc
client = zerorpc.Client()
url = "tcp://localhost:5555"
client.connect(url)
print client.reverse("alfabeta")
print client.makebig("alfabeta")
并运行它
$python client.py
atebafla
ALFABETA
从python代码server.py运行远程服务器
import zerorpc
import worker
url = "tcp://*:5555"
srv = zerorpc.Server(worker)
srv.bind(url)
srv.run()
如果命令仍然运行,则停止由命令zerorpc启动的旧服务器.
然后启动服务器的python版本:
$python server.py
(它不打印任何内容,仅等待投放).
最后,从您的Python代码中使用它
$python client.py
atebafla
ALFABETA
结论
>使用zeromq或zerorpc可以大大简化这种情况
>以不同的顺序播放client.py和server.py
>尝试运行多个客户端
>尝试从另一台计算机(通过网络)使用服务
> zerorpc提供了更多模式(流媒体,发布/订阅),请参见zerorpc测试套件
> zerorpc解决了集成任务,让您专注于对实函数进行编码
内容总结
以上是互联网集市为您收集整理的如果使用Popen启动两个python脚本,为什么我的两个python脚本之间的套接字连接断开?全部内容,希望文章能够帮你解决如果使用Popen启动两个python脚本,为什么我的两个python脚本之间的套接字连接断开?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。