2014-10-09 2 views
0

약 1 주일 동안이 문제와 맞서 싸우고 있으며 해결책을 찾기 위해 더 이상 어디를보아야할지 모르겠습니다.PyRO 4 - 등록 된 개체를 찾으려고 할 때 검색이 실패합니다.

필자가 pyro 개체를 성공적으로 등록하자마자 NS에서 해당 개체를 찾으려고 노력하지만 조회가 실패합니다.

import threading, socket, sys 
import Pyro4 


class Server(): 

    def __init__(self): 
     self.start_ns_loop() 

    def start_ns(self): 

     print("Starting the Name Server...") 

     try: 

      Pyro4.naming.startNSloop() 

     except socket.error: 

      print("Name Server already running.") 
      sys.exit(0) 

    def start_ns_loop(self): 

     ns_thread = threading.Thread(target=self.start_ns, args=[]) 
     ns_thread.daemon = True 
     ns_thread.start() 

TextAnalyzer 클래스는 내가 사용하는 클래스입니다 :

서버가 파이 NS가 시작되는 클래스입니다 :

나는 상황이 더 명확하게, 내 코드의 단순화 된 버전을 게시 파일에 대한 통계 수행 :

import nltk, argparse, Pyro4, socket 
    class TextAnalyzer(): 


    def __init__(self): 
     #init function in which I do all my things... 

    '''after the init, I've some methods. I don't list them 
    because they are not important in this discussion''' 

    def get_ip_addr(self): 

     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     s.connect(("8.8.8.8", 80)) 
     ns_ip = str(s.getsockname()[0]) 
     s.close() 

     return ns_ip 


def main(): 

    global nsip, PYRO_OBJ_NAME 
    text_analyzer_name = "Text_Analyzer_" 

    # Parser configuration for the input values 
    parser = argparse.ArgumentParser(description="Values: ") 
    parser.add_argument("-id", help="Sets the text analyzer ip.") 
    parser.add_argument("-nsip", help="Sets the Name Server ip.") 
    args = parser.parse_args() 

    if args.id is not None: 
     identifier = str(args.id) 
    else: 
     identifier = "" 

    if args.nsip is not None: 
     name_server_ip = str(args.nsip) 
    else: 
     name_server_ip = "" 

    a = TextAnalyzer() 

    try: 

     if name_server_ip != "": 
      nsip = Pyro4.naming.locateNS(name_server_ip) 
     else: 
      nsip = Pyro4.naming.locateNS() 

     PYRO_OBJ_NAME = text_analyzer_name + str(identifier) 
     print("PyRO Object name: " + PYRO_OBJ_NAME) 
     daemon = Pyro4.Daemon(a.get_ip_addr()) 

     uri_text_analyzer = daemon.register(a) 
     nsip.register(PYRO_OBJ_NAME, uri_text_analyzer, safe=True) 

     print("URI " + PYRO_OBJ_NAME + ": " + str(uri_text_analyzer)) 

     daemon.requestLoop() 

    except Pyro4.naming.NamingError as e: 

     print(str(e)) 

if __name__ == "__main__": 

    main() 

연결 클래스는 NS에있는 개체를 찾을하는 데 유용 모든 방법을 제공합니다, SFTP 및 SSH 연결은의 PID를 찾습니다 객체 실행 중 ...

import Pyro4, paramiko, socket, time 
from PyQt4 import QtCore, QtGui 


class Connection(QtGui.QMainWindow): 

def __init__(self): 

    super(Connection, self).__init__() 

    self.text_analyzer_name = "Text_Analyzer_" 
    self.identifier = None 
    self.address = None 
    self.password = None 
    self.object_pid = None 
    self.authentication_ok = False 

def get_ip_addr(self): 

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    s.connect(("8.8.8.8", 80)) 
    ns_ip = str(s.getsockname()[0]) 
    s.close() 
    print(ns_ip) 
    return ns_ip 

# This method finds the object on the NS 
def find_obj(self, identifier, a, p): 

    self.identifier = identifier 
    self.address = a 
    self.password = p 

    self.open_server_connection() 

    time.sleep(5) 

    if self.authentication_ok is True: 

     try: 
      ns = Pyro4.naming.locateNS() 
      print("Return del locateNS(): " + str(ns)) 
      uri_text_analyzer = ns.lookup(self.text_analyzer_name + str(self.identifier)) 
      self.text_analyzer = Pyro4.Proxy(uri_text_analyzer) 
      return True 

     except Pyro4.errors.NamingError as e: 
      print(str(e)) 
      self.ssh_connection_close_and_cleanup() 
      return False 

def open_server_connection(self): 

    print("Object ID: " + str(self.identifier)) 

    ssh_connection = paramiko.SSHClient() 

    ssh_connection.load_system_host_keys() 

    ssh_connection.set_missing_host_key_policy(paramiko.AutoAddPolicy) 

    try: 
     if str(self.address).__contains__('@'): 
      (username, hostname) = self.address.split('@') 
      print("User: " + username + ", Host: " + hostname) 
      print("Tento la connessione.") 
      ssh_connection.connect(str(hostname), username=username, password=str(self.password), timeout=5, allow_agent=False) 

     else: 
      ssh_connection.connect(str(self.address), password=str(self.password), timeout=5, allow_agent=False) 

     self.authentication_ok = True 

     ns_ip = self.get_ip_addr() 
     sftp_connection = ssh_connection.open_sftp() 
     print("Sftp connection open.") 
     print("Transferring " + self.text_analyzer_name + str(self.identifier) + "...") 
     sftp_connection.put("text_analyzer.py", "./text_analyzer.py") 
     print("Transferring Pyro4...") 
     sftp_connection.put("Pyro4.zip", "./Pyro4.zip") 
     print("Unpacking...") 
     stdin, stdout, stderr = ssh_connection.exec_command("tar -xzvf Pyro4.zip") 
     time.sleep(3) 
     print("Executing " + self.text_analyzer_name + str(self.identifier) + ":") 
     stdin, stdout, stderr = ssh_connection.exec_command("echo $$; exec python3 text_analyzer.py -id {} -nsip {}".format(self.identifier, ns_ip)) 

     # Object PID saving 
     self.object_pid = int(stdout.readline()) 
     print("PID del " + self.text_analyzer_name + str(self.identifier) + ": " + str(self.object_pid)) 
     # Connections close 
     ssh_connection.close() 
     sftp_connection.close() 

    except (paramiko.AuthenticationException, socket.error) as e: 
     self.authentication_ok = False 
     ssh_connection.close() 
     print("Connection failed, error: " + str(e)) 

def ssh_connection_close_and_cleanup(self): 

    ssh_connection = paramiko.SSHClient() 

    ssh_connection.load_system_host_keys() 

    ssh_connection.set_missing_host_key_policy(paramiko.AutoAddPolicy) 

    try: 
     if str(self.address).__contains__('@'): 
      (username, hostname) = self.address.split('@') 
      ssh_connection.connect(str(hostname), username=username, password=str(self.password), timeout=5, allow_agent=False) 
     else: 
      ssh_connection.connect(str(self.address), password=str(self.password), timeout=5, allow_agent=False) 

     self.host = hostname 
     print("Killing PID: " + str(self.object_pid)) 
     ssh_connection.exec_command("/bin/kill -KILL {}".format(self.object_pid)) 
     ssh_connection.exec_command("rm -r Pyro4") 
     ssh_connection.exec_command("rm -r Pyro4.zip") 
     ssh_connection.exec_command("rm text_analyzer.py") 
     time.sleep(5) 

     ssh_connection.close() 

    except(paramiko.AuthenticationException, socket.error) as e: 
     ssh_connection.close() 
     print("Connection failed") 
     print(str(e)) 

그래서 기본적으로 이것은 내가하는 일입니다.

NS에서 원격 객체를 찾으려고 시도하는 동안 조회가 실패합니다 (Connection 클래스에 포함 된 find_obj() 메소드 내부에서 문제가 발생하지만 원격 객체가 성공적으로 등록되었음을 알고 있습니다).

주어진 오류는 Pyro4.errors.NamingError의 "unknown name"입니다.

나는 그것이 작동하지 않는 이유를 정말 단서 ...

또한 사양이 없다 : 나는 파이 4 파이썬 3.4, 맥 OS X 매버릭스에 그것을 실행하는거야.

답장을 미리 보내 주셔서 감사합니다.

답변

0

nsc 도구를 사용하여 이름 서버의 데이터베이스를 볼 수 있습니다. 올바른 이름 서버에 연결했는지 확인하십시오. 요청한 객체가 실제로 거기에 없다는 것을 알 수 있습니다. (그렇지 않으면 파이로가 당신에게 우르를 건네줍니다.)

또 다른 힌트는 요청한 이름이 등록한 이름과 정확히 일치하는지 확인하는 것입니다. 또한 아마도 여러 개의 네임 서버가 실행되고 있는지 확인하고, 아마도 네임 코드가 어쩌면 혼란스러워할까요?

관련 문제