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

Posted

技术标签:

【中文标题】在 python 中跨两个程序发送数据【英文标题】:sending data across two programs in python 【发布时间】:2016-04-13 18:50:03 【问题描述】:

这是我的代码:

socketcheck.py

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

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

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

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'

【问题讨论】:

【参考方案1】:

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

每次创建一个新的popen的原因有点复杂:你在socketcheck.py中打开了一个新的server.py程序。如果这个新的 server.py 程序调用 print_from_server(data),这是第一次调用 print_from_server(data)(对于新的 server.py 程序)。所以全局命令(比如popen)都会被执行,因为它们总是执行一次。

正在运行的进程数量会迅速增加,您的计算机会崩溃。

补充一点:您不能在子进程中使用print 命令打印到控制台,因为该子进程没有附加控制台,您只能打印到文件。如果你这样做,你会看到这个输出在所有进程中迅速爆发。

将socketcheck.py和server.py放到一个程序中,一切正常,或者解释一下为什么需要两个程序。

【讨论】:

但是在这里我试图将参数传递给socketcheck.py中定义的函数,那么为什么每次都创建一个新的子进程呢?它不应该只是调用 print_from_server 函数吗? 奇怪,如果你使用 print to file 语句而不是 popen,它真的只执行一次。 我现在明白了:你在 socketcheck.py 中打开了一个新的 server.py 程序。如果这个新的 server.py 程序调用 print_from_server(data),这是它第一次被调用(对于新的 server.py 程序)。所以全局命令(例如popen)被执行,因为它们被执行一次。 这是一个合乎逻辑的解释,谢谢:) 有什么解决方法吗?查看我通过将 server.py 和 socketcheck.py 放在同一个文件中尝试过的编辑【参考方案2】:

使用多线程可以轻松实现该功能:)

【讨论】:

以上是关于在 python 中跨两个程序发送数据的主要内容,如果未能解决你的问题,请参考以下文章

Python Quart websocket,在两个客户端之间发送数据

在 iOS9 中跨应用程序共享 cookie

如何使用 python 3x 从两个单独的运行 python 文件发送数据

新星微前端MicroApp的基础教程

在 Vuejs 中跨不同组件共享数据

在 Vuejs 中跨不同组件共享数据