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実行は 1 回です。

// 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 自体によって提供されるわけではありません。PyInitand と呼ばれるものを提供する 1 つのライブラリを見つけましたPyExecute-- Metatrader と呼ばれるものの Python 統合を提供します -- そして、それがあなたが使用しているものであると推測します。そうでない場合でも、実際に使用しているものは、次の内容を理解するのに十分類似している可能性があります。

とにかく、あなたが今やっていることは確かに正しいとは言えません: 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')

ループの前のものは、1 行に 1 つのステートメントだけなので、おそらくそのままで問題ありません。

「すべてを与える」という意味を明確にするために、次のような複数行のコードを含む単一の文字列が必要です。

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 の自動連結機能を使用しました。"..."空白だけで区切られた一連の文字列を記述すると、それらは 1 つの長い文字列として扱われます。実際に他の C ライクな言語で書いていて、たまたまその構文をサポートしていない場合、コードは少し見苦しくなります。
  • コード内のバックスラッシュはエスケープされます (ここでも文字列の C 構文を想定していますが、別の言語を使用している場合は正しい場合と正しくない場合があります)
于 2012-04-29T19:56:51.987 に答える