2012-04-29 28 views
2

嵌入式Python源代碼的這部分工作。我是否需要研究子進程以使此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循環沒有明顯的差異。

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') 

回答

1

首先,不清楚PyExecute實際上是什麼;它不是由Python本身提供的。我找到了一個庫,它提供了一些叫做PyInitPyExecute的東西 - 它提供了一個名爲Metatrader的Python集成 - 我將猜測這就是你正在使用的東西。即使你不是,但你實際使用的東西可能足夠相似,以至於仍然有意義。

因此,無論如何,你現在正在做的事情當然不可能是正確的:當你告訴它執行while True:時,你希望Python解釋器做什麼?唯一可能的答案是(1)帶有空循環體的無限循環,以及(2)沒有任何東西,直到你以某種方式提供了循環體並告訴它你已經完成了這樣的動作。 (1a)中的第一個細分沒有任何用處,因爲它是一個語法錯誤和(1b)循環,從來沒有做任何事情。這些結果都不會對你有任何用處。 (我很確定實際的答案是(1a)或(1b),但沒有檢查哪個)。

你實際上需要做的是提供PyExecute - 我認爲這是一個薄包裝實際上是部分Python PyRun_SimpleString - 具有完整的語句執行。那將是整個循環。所以給它整個東西,包括換行和縮進,看看是否表現更好。

我在那裏強調了「和indentation」,因爲它代表錯誤地縮進,並且在Python中indentation實際上是由解析器使用的。相關位可能想是這樣的:

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語法,可如果您使用的是不同的語言,或者可能是不正確的)
+0

我刪除從可執行對計算器可讀性縮進。但下次我會保留它。是的,'PyExecute'是Metatrader [MQL4]的集成包的一部分,這是本機代碼。我將努力完成循環,看看是否能解決這個問題。謝謝。 – user1337878

+0

這沒有奏效。我嘗試了幾個版本。 – user1337878

+0

我可能能夠使用'PyRun_SimpleString'找到一些支持。謝謝您的幫助。 – user1337878

相關問題