2014-10-21 3 views
2
와 내가 파이로 네임 서버를 시작하면 내가 위지

는 파이로의 네임 서버를 찾을 수 없습니다

를 실행하는 라즈베리 파이에 파이썬 2.7 Pyro4을 사용하고

중 하나

pyro4-ns & 

또는

python -m Pyro4.naming & 

내 코드는 아무런 오류없이 예상대로 작동합니다. 그러나 나는

/home/pi/Wakeup-Lamp/lamp_daemon.py & 

나는 다음과 같은 오류를 얻을 백그라운드 프로세스로 lamp_daemon.py를 시작할 때 나는 다음과 명령

/etc/init.d/pyro-nsd start 

와 파이로 네임 서버 데몬을 시작하면

File "/home/pi/Wakeup-Lamp/lamp_daemon.py", line 27, in
nameServer = Pyro4.locateNS()
File "/usr/local/lib/python2.7/dist-packages/Pyro4/naming.py", line 358, in locateNS
raise e
Pyro4.errors.NamingError: Failed to locate the nameserver

lamp_daemon.py 코드는

#!/usr/bin/python 

from current_lamp_state import CurrentLampState 
from lamp_state import LampState 
from pwm import Pwm 
import Pyro4 
import Pyro.core 
import Pyro.naming 

class LampSwitch(Pyro.core.ObjBase): 
    __currentLampState = CurrentLampState() 
    __pwm = Pwm() 

    def get_lamp_state(self): 
    return self.__currentLampState.get() 

    def set_lamp_state(self, new_lamp_state): 
    self.__currentLampState.set(new_lamp_state) 
    self.__pwm.update() 

lampSwitch = LampSwitch() 
daemon = Pyro4.Daemon() 
nameServer = Pyro4.locateNS() 
uri = daemon.register(lampSwitch) 
nameServer.register("lamp.daemon", uri) 
daemon.requestLoop() 
입니다.

Google이 꽤 있지만 문제를 해결할 수없는 것 같습니다. 누구든지 내가 뭘 잘못하고 있는지에 대한 단서가 있습니까?

+0

네임 서버가 실행 중인지 확인하려면이 명령을 실행 해보십시오. 'pyro4-nsc list' – Gohn67

+0

재미있는'/ etc/init.d/pyro-nsd' 상태는 서버 프로세스 3110이 실행중인 결과를 제공합니다. 그러나'pyro4-nsc list'는 결과를 제공합니다. 이름 서버를 찾지 못했습니다 : 이름 서버를 찾을 수 없습니다. – TheLukeMcCarthy

+0

아직 pyro-nsd를 사용하지 않았습니다. 하지만 그 파일의 내용을 확인하여 이름 서버를 초기화하는 방법을 확인합니다. – Gohn67

답변

0

이것이 완전히 문제를 해결할 지 확신 할 수 없지만 여기에 pyro-nsd과 (과) python2.7을 함께 사용하는 방법을 배웠습니다. 이 경우에는 우분투 14.04를 사용했습니다. Wheezy 버전에서는 다를 수 있습니다.

  1. sudo apt-get install pyro4을 사용하여 설치했습니다. pyro4-nsd은 pip를 통해 설치되지 않았기 때문에 설치되었습니다.
  2. 우선주의해야 할 점은 pyro4-nsc list이 인식되지 않는다는 것입니다.
  3. 그렇다면 나는 pyro4를 사용하여 sudo pip install pyro4을 사용합니다.
  4. 지금 pyro4-nsc list이 작동하지만 Failed to locate the nameserver 오류가 발생합니다.

그래서 /etc/init.d/pyro4-nsd의 구성을 살펴보고 흥미로운 점을 발견했습니다.

1

python3가 설치되어있는 경우 스크립트를 확인합니다. 그렇다면 으로 의존성으로 설치된 pyro4의 python3 버전을 사용할 것입니다.

여기서는 단지 python2.7을 사용합니다.

지금 pyro4-nsc list는 실제로 작동,하지만 난이 오류 : Error: CommunicationError - cannot connect: hmac key config not symmetric를, 내가주의 다음 일이 pyro4-nsd에서 export PYRO_HMAC_KEY=12345 라인 번호 2

2

에 이르게한다.

Pyro4/configuration.py 파일에서 이것은 python3 (https://github.com/delmic/Pyro4/blob/ccea9c2870a1280010bcc56f4146bc1617ec6e8d/src/Pyro4/configuration.py#L81)에만 사용 된 것 같습니다.여기에이 코드를 참조하십시오

if self.HMAC_KEY and sys.version_info>=(3,0): 
     if type(self.HMAC_KEY) is not bytes: 
      self.HMAC_KEY=bytes(self.HMAC_KEY, "utf-8")  # convert to bytes 

그래서, 기본적으로 난 그냥 PYRO_HMAC_KEY 수출 라인을 제거했다.

3.

사소한 일하지만 sudo service pyro4-nsd restart, 시작을하고

는 서비스를 중지 한 다음 시작해야 서비스를 중지합니다. 여기,

는 서버의 파이 버전이 클라이언트보다 다른 경우
#!/bin/sh 
### BEGIN INIT INFO 
# Provides:   pyro4-nsd 
# Required-Start: $time $local_fs $remote_fs $network 
# Required-Stop:  $time $local_fs $remote_fs $network 
# Default-Start:  2 3 4 5 
# Default-Stop:  0 1 6 
# Short-Description: Pyro4 name server daemon 
# Description:  Debian init script for pyro4-nsd (Pyro4 name server daemon) 
### END INIT INFO 

# ------------------------------------------------------------------------- 
# <Pyro4 NameServer Daemon Script> 
# Copyright (C) <2011> <Pierre PACORY> - [email protected] 
# Licensed under the "MIT Software License" for inclusion in Pyro4. 
# ------------------------------------------------------------------------- 


LISTEN_ADDRESS=0.0.0.0 
LISTEN_PORT=9999 
MESSAGEDIR=/var/log/Pyro4 
MESSAGELOG=/var/log/Pyro4/NameServer.log 
PID=/var/run/Pyro4-NameServer.pid 

# Defaults - don't touch, edit /etc/default/pyro-nsd 
ENABLED=0 

if [ -f /etc/default/pyro4-nsd ] ; then 
     . /etc/default/pyro4-nsd 
fi 

if [ "$ENABLED" = "0" ]; then 
    echo "pyro4-nsd: disabled, see /etc/default/pyro4-nsd" 
    exit 0 
fi 

# Add Pyro Config 
# here you can add others ... 

# NOTE: Comment out PYRO_HMAC_KEY since it appears to be used only for Python3 
#export PYRO_HMAC_KEY=12345 
export PYRO_LOGFILE="$MESSAGELOG" 
export PYRO_LOGLEVEL=DEBUG 

. /lib/lsb/init-functions 

# Check the script is being run by root user 
if [ "$(id -u)" != "0" ]; then 
    echo 1>&2 "ERROR: The $0 script must be run as root" 
    exit 1 
fi 

# Create the PID File 
touch $PID 

# Detect if Python 2.x or Python 3.y is installed 

# NOTE: For the use of python2.7 here 
PYTHON=python2.7 
[ -x /usr/bin/$PYTHON ] || PYTHON=python 

case "$1" in 
    start) 
    # create the log directory if not exist 
    [ ! -d "$MESSAGEDIR" ] && mkdir -p "$MESSAGEDIR" 

    echo "Starting Pyro4 Name Server" 
    # test if not already running 
    if [ ! -f "/proc/$(cat $PID)/exe" ]; then 
     $PYTHON -m Pyro4.naming -n "$LISTEN_ADDRESS" -p "$LISTEN_PORT" >/dev/null 2>&1 & 
     echo $!>"$PID" 
    else 
     echo "Pyro4 Name Server already running" 
    fi 
    ;; 
    stop) 
    echo "Stopping Pyro4 Name Server" 
    # test if running 
    if [ -f "/proc/$(cat $PID)/exe" ]; then 
     kill -9 "$(cat $PID)" 
     rm -rf "$PID" 
    else 
     echo "Pyro4 Name Server already stopped" 
    fi 
    ;; 
    restart) 
    # Stop, then Start 
    $0 stop 
    $0 start 
    ;; 
    force-reload) 
    # Stop, then Start 
    $0 stop 
    $0 start 
    ;; 
    *) 
    echo "usage: $0 {start|stop|restart|force-reload}" 
esac 
exit 0 
+0

고마워요 @ Gohn67 오늘 밤 집에 올 때 그것을 시험해 보겠습니다. – TheLukeMcCarthy

1

는이 네임 서버를 찾기 위해 실패를 확인하는 방법입니다 : 여기

수정 된 pyro4-NSD 파일입니다 파이 버전 :

파이썬 -c "C 등의 수입 Pyro4.constants, 인쇄 (c.PROTOCOL_VERSION)"

그렇지 않은 경우 같은, 다음 파이 모듈을 제거하고 다시 설치하십시오.

위의 단계를 수행했을 때 비슷한 문제가 발생했습니다.

관련 문제