首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中跨两个程序发送数据

在python中跨两个程序发送数据
EN

Stack Overflow用户
提问于 2016-04-13 18:50:03
回答 2查看 105关注 0票数 1

这是我的密码:

socketcheck.py

代码语言:javascript
运行
复制
import time
import subprocess

subprocess.Popen(["python", "server.py"])

for i in range(10):
    time.sleep(2)
    print i

def print_from_server(data):
    print data

server.py

代码语言:javascript
运行
复制
import socket
from socketcheck import print_from_server

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind(('localhost',3005))

client_connected = 1

while 1:
    s.listen(1)
    conn, addr = s.accept()
    data = conn.recv(1024)
    if data:
        client_connected = 0
    else: break
    if client_connected == 0:
        print 'data received'
        print_from_server(data)
        client_connected = 1
    conn.sendall(data)

client.py

代码语言:javascript
运行
复制
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost',3005))
s.sendall('Hello, world')
data = s.recv(1024)
#s.close()
print 'Received', repr(data)

我在这里要做的是,运行socketcheck.py,它在后台运行server.py并侦听客户端连接。因此,无论客户端发送什么数据,我都希望将其传递给socketcheck.py。这有效吗?如果是的话,那我该如何实现呢?

现在,当我尝试运行socketcheck.py时,for循环将无限期地运行。

谢谢:)

编辑:

这最初我尝试作为一个程序,但在客户端连接之前,程序的其余部分不执行(阻塞),使用setblocking(0),程序流不会停止,但是当客户机连接到服务器时,它不会打印(做任何事情)。服务器代码如下所示:

从socketcheck导入print_from_server导入套接字

代码语言:javascript
运行
复制
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind(('localhost',3005))
s.setblocking(0)

while 1:
    try:
        s.listen(1)
        conn, addr = s.accept()
        conn.setblocking(0)
        data = conn.recv(1024)
        if not data: break
        print 'data received'
        conn.sendall(data)
    except:
        print 'non blocking'
print 'the lengthy program continues from here'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-13 19:59:43

程序崩溃的原因很简单:您有一个调用whileprint_from_server(data)循环,每次调用它,都会通过subprocess.Popen(["python", "server.py"])创建一个新的子进程。

每次创建一个新的popen的原因要复杂一些:您可以在server.py中打开一个新的socketcheck.py程序。如果这个新的server.py程序调用print_from_server(数据),这是第一次调用print_from_server(数据)(用于新的server.py程序)。因此执行全局命令(如popen),因为它们总是只执行一次。

运行的进程数量将迅速爆炸,您的计算机将崩溃。

另一个注意事项:不能在子进程中使用print命令打印到控制台,因为没有附加到该子进程的控制台,所以只能打印到文件。如果您这样做,您将看到这个输出从所有进程中快速增长。

将socketcheck.py和server.py放在一个程序中,一切都可以正常工作,或者解释为什么需要两个程序。

票数 0
EN

Stack Overflow用户

发布于 2016-04-14 15:16:06

这个功能可以很容易地通过多线程实现:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36607051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档