Skip to main content
 首页 » 编程设计

python之我是否需要研究子进程才能使此 python 源代码在另一种编程语言中工作

2025年05月04日48三少

这部分嵌入式 python 源代码有效。

//Native Source Code [C - Like Language] 
string zncauth = nick + ":" + password; 
 
//Initializes Python for executing [Python Source Code] 
PyInit(); 
 
//Python Source Code 
PyExecute("import socket"); 
 
// Create Connetion 
PyExecute("server_addr = '127.0.0.1'"); 
PyExecute("server_port = 6667"); 
PyExecute("s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)"); 
PyExecute("s.connect((server_addr, server_port))");    
PyExecute("s.send( \'NICK botnick\\r\\n\')");    
PyExecute("s.send( \'USER znc bot znc :znc\\r\\n\')");   
PyExecute("s.send( \'PASS " + zncauth + " \\r\\n\')");   

这就是问题所在。它在 9 分钟后超时并与服务器断开连接。我的猜测是 while 语句 运行一次。

// Ping Pong     
PyExecute("while True:\'\\n\'");     
PyExecute("data = s.recv(4096)"); 
PyExecute("if data.find( \"PING\" ) != -1:\'\\n\'"); 
PyExecute("s.send ( \'PONG \' + data.split() [ 1 ] + \'\\r\\n\' )"); 
PyExecute("if data.find ( \'You need to send your password. Try /quote PASS <username>:<password>\' ) != -1:\'\\n\'"); 
PyExecute("s.send (\'PASS " + zncauth + " \\r\\n\')"); 

这是我尝试过的 while 循环问题的最新版本。当它运行时,这个或上面版本的 while 循环没有明显的区别。

    PyExecute("data = s.recv(4096)"); 
PyExecute("while data != 0:\'\\n\'");    
PyExecute("if data.find( \"PING\" ) != -1:\'\\n\'"); 
PyExecute("if data == 0:\'\\n\'"); 
PyExecute("break");  

这是上面相同 python 代码的可执行文件。它在 irc 网络上停留了几个小时,但我需要通过它创建的连接发送消息。我需要找到一种方法通过此可执行文件发送消息,该可执行文件将依次处理消息或正确嵌入 while 语句,以便它在 native 代码中工作。

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
 
//Test.py 
import socket 
 
zncauth = 'nick:password' 
server_addr = '127.0.0.1' 
server_port = 6667 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((server_addr, server_port))    
s.send( 'NICK botnick\r\n') 
s.send( 'USER znc bot znc :znc\r\n') 
s.send( 'PASS ' + zncauth + ' \r\n') 
 
while True: 
    data = s.recv(4096) 
    if data.find ( 'PING' ) != -1: 
        s.send ( 'PONG ' + data.split() [ 1 ] + '\r\n' ) 
    if data.find ( 'You need to send your password. Try /quote PASS <username>:<password>' ) != -1: 
        s.send ('PASS ' + zncauth + ' \r\n') 

请您参考如下方法:

首先,不清楚 PyExecute 到底是什么;它不是由 Python 本身提供的。我发现了一个库,它提供了名为 PyInit 和 PyExecute 的东西——它为名为 Metatrader 的东西提供了 Python 集成——我猜这就是你在用什么。即使您不是,您实际使用的内容也可能足够相似,因此下面的内容仍然有意义。

所以,无论如何,您现在所做的肯定是不对的:当您告诉 Python 解释器执行 while True: 时,您期望它做什么?唯一可能的答案是 (1) 一个带有空循环体的无限循环,以及 (2) 直到您以某种方式提供循环体并告诉它您已经完成了。第一个分割为 (1a) 没有任何用处,因为它是一个语法错误和 (1b) 循环永远什么都不做。这些结果都不会对你有任何用处。 (我很确定实际答案是 (1a) 或 (1b),但还没有检查是哪一个。)

您实际上需要做的是提供 PyExecute——我认为它是围绕 Python 实际部分的薄包装器 PyRun_SimpleString——带有要执行的完整语句。那将是整个循环。所以给它整个东西,包括换行符 和缩进 ,看看它的表现是否更好。

我在那里强调了“和缩进”,因为就目前而言,您的代码缩进是错误的,而在 Python 中,缩进实际上是由解析器使用的。相关位可能希望是这样的:

while True: 
    data = s.recv(4096) 
    if data.find ( 'PING' ) != -1: 
        s.send ( 'PONG ' + data.split() [ 1 ] + '\r\n' ) 
    if data.find ( 'You need to send your password. Try /quote PASS <username>:<password>' ) != -1: 
        s.send ('PASS ' + zncauth + ' \r\n') 

循环之前的内容,每行只有一个语句,可能就这样了。

为了阐明我所说的“全部提供”的意思:您需要一个包含多行代码的单个 字符串,如下所示:

PyExecute( 
    "while True:\n" 
    "  data = s.recv(4096)\n" 
    "  if (data.find('PING') != -1:\n" 
    "    s.send('PONG' + data.split()[1] + '\\r\\n')\n" 
    ...) 

在哪里

  • 每一行都以明确的\n结束
  • 每行适当缩进,开头有空格
  • 我使用了 C 的自动连接功能,如果您编写一堆 "..." 字符串,它们之间只有空格,它们将被视为一个较长的字符串;如果您实际上是在用其他一些类似 C 的语言编写,而它恰好不支持该语法,那么代码看起来会有点难看
  • 代码中的反斜杠被转义(我再次假设字符串使用 C 语法,如果您使用不同的语言,这可能正确也可能不正确)