2

这部分嵌入式 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 statement运行一次。

// 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 statement正确嵌入消息,以便它在本机代码中工作。

#!/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')
4

1 回答 1

1

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

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

你真正需要做的是提供PyExecute——我认为它是 Python 的实际部分的一个薄包装PyRun_SimpleString——一个完整的语句来执行。那将是整个循环。所以给它整个东西,包括 newlines和 indentation,看看它是否表现得更好。

我在那里强调了“和缩进”,因为就目前而言,您的代码缩进错误,并且在 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 语法,如果您使用不同的语言,这可能正确也可能不正确)
于 2012-04-29T19:56:51.987 回答