Python Can';使用Pyro nsd时找不到Pyro名称服务器

Python Can';使用Pyro nsd时找不到Pyro名称服务器,python,python-2.7,raspberry-pi,pyro,Python,Python 2.7,Raspberry Pi,Pyro,我将Pyro4与Python2.7一起用于Raspberry Pi running Wheezy 当我启动Pyro名称服务器时 pyro4-ns & 或 我的代码按预期工作,没有任何错误。但是,当我使用follow命令启动Pyro name服务器守护程序时 /etc/init.d/pyro-nsd start 当我启动lamp_daemon.py作为后台进程时 /home/pi/Wakeup-Lamp/lamp_daemon.py & 我得到以下错误 文件“/home/pi

我将Pyro4与Python2.7一起用于Raspberry Pi running Wheezy

当我启动Pyro名称服务器时

pyro4-ns &

我的代码按预期工作,没有任何错误。但是,当我使用follow命令启动Pyro name服务器守护程序时

/etc/init.d/pyro-nsd start
当我启动lamp_daemon.py作为后台进程时

/home/pi/Wakeup-Lamp/lamp_daemon.py &
我得到以下错误

文件“/home/pi/Wakeup Lamp/Lamp_daemon.py”,第27行,在
nameServer=Pyro4.locateNS()
文件“/usr/local/lib/python2.7/dist packages/Pyro4/naming.py”,第358行,位置
提高e
Pyro4.errors.NamingError:未能找到名称服务器

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

我用谷歌搜索了很多次,但我似乎无法解决这个问题。有人知道我做错了什么吗?

我不确定这是否能完全解决您的问题,但以下是我在尝试使用python2.7获得pyro nsd时学到的。我在本例中使用了Ubuntu 14.04。喘息型可能不同

  • 我使用
    sudo apt get install pyro4
    安装,因为
    pyro4 nsd
    不是通过pip安装的
  • 我注意到的第一件事是,pyro4 nsc列表未被识别
  • 然后我使用
    sudopip安装pyro4
  • 现在
    pyro4-nsc-list
    可以工作了,但是我发现
    找不到nameserver
    错误
  • 因此,我查看了
    /etc/init.d/pyro4 nsd
    的配置,发现了一些有趣的东西

    1.

    脚本检查是否安装了python3。如果是,它将使用python3版本的pyro4,该版本作为依赖项安装在
    sudo-apt-get-install-pyro4

    在这里,我只是使用了
    python2.7

    现在
    pyro4 nsc list
    实际上可以工作了,但是我得到了这个错误:
    错误:CommunicationError-无法连接:hmac key config not symmetric
    ,这导致了数字2

    2.

    接下来我注意到的是
    pyro4 nsd
    中的
    export PYRO\u HMAC\u KEY=12345

    Pyro4/configuration.py
    文件中,这似乎只用于python3:()。请参见此处的代码片段:

        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\u HMAC\u键
    导出行

    3.

    次要的事情,但执行
    sudo service pyro4 nsd restart
    ,在应该停止服务然后启动服务时启动然后停止服务

    以下是修改后的pyro4 nsd文件:

    #!/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> - ppacory@gmail.com
    # 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
    
    #/垃圾箱/垃圾箱
    ###开始初始化信息
    #提供:pyro4 nsd
    #所需开始时间:$time$local\u fs$remote\u fs$network
    #所需停止:$time$local\u fs$remote\u fs$network
    #默认开始:2 3 4 5
    #默认停止:0 1 6
    #简短描述:Pyro4名称服务器守护程序
    #描述:pyro4 nsd的Debian init脚本(pyro4名称服务器守护进程)
    ###结束初始化信息
    # -------------------------------------------------------------------------
    #    
    #版权所有(C)—ppacory@gmail.com
    #根据“MIT软件许可证”获得许可,可包含在Pyro4中。
    # -------------------------------------------------------------------------
    监听地址=0.0.0.0
    监听端口=9999
    MESSAGEDIR=/var/log/Pyro4
    MESSAGELOG=/var/log/Pyro4/NameServer.log
    PID=/var/run/Pyro4-NameServer.PID
    #默认值-不触摸、编辑/etc/default/pyro nsd
    已启用=0
    如果[-f/etc/default/pyro4 nsd];然后
    . /etc/default/pyro4 nsd
    fi
    如果[“$ENABLED”=“0”];然后
    echo“pyro4 nsd:禁用,请参阅/etc/default/pyro4 nsd”
    出口0
    fi
    #添加Pyro配置
    #在这里您可以添加其他。。。
    #注意:注释掉PYRO_HMAC_键,因为它似乎只用于Python3
    #导出PYRO_HMAC_密钥=12345
    导出PYRO_日志文件=“$MESSAGELOG”
    导出PYRO_LOGLEVEL=调试
    . /lib/lsb/init函数
    #检查该脚本是否由root用户运行
    如果[“$(id-u)”!=“0”];然后
    echo 1>&2“错误:必须以root用户身份运行$0脚本”
    出口1
    fi
    #创建PID文件
    触摸$PID
    #检测是否安装了Python2.x或Python3.y
    #注:此处用于python2.7的使用
    PYTHON=python2.7
    [-x/usr/bin/$PYTHON]| | PYTHON=PYTHON
    案件“$1”
    开始)
    #创建日志目录(如果不存在)
    [!-d“$MESSAGEDIR”]&&mkdir-p“$MESSAGEDIR”
    echo“启动Pyro4名称服务器”
    #如果尚未运行,则进行测试
    如果[!-f”/proc/$(cat$PID)/exe“];然后
    $PYTHON-m Pyro4.naming-n“$LISTEN\u ADDRESS”-p“$LISTEN\u PORT”>/dev/null 2>&1&
    echo$!>“$PID”
    其他的
    echo“Pyro4名称服务器已在运行”
    fi
    ;;
    (停止)
    回显“停止Pyro4名称服务器”
    #测试是否正在运行
    如果[-f”/proc/$(cat$PID)/exe”];然后
    杀死-9“$(类别$PID)”
    rm-rf“$PID”
    其他的
    echo“Pyro4名称服务器已停止”
    fi
    ;;
    重新启动)
    #停下来,然后开始
    0美元一站
    零美元起价
    ;;
    (强制重新加载)
    #停下来,然后开始
    0美元一站
    零美元起价
    ;;
    *)
    echo“用法:$0{start | stop | restart | force reload}”
    以撒
    出口0
    
    如果服务器上的pyro版本与客户端上的不同,则无法找到名称服务器,以下是检查pyro版本的方法:

    python-c“将Pyro4.constants作为c导入;打印(c.PROTOCOL\u版本)”

    如果不相同,请卸载pyro模块并重新安装


    我遇到了一个类似的问题,当我执行上述步骤时,该问题已得到修复。

    可能尝试运行此命令以查看名称服务器是否正在运行:
    pyro4 nsc list
    有趣,
    /etc/init.d/pyro nsd
    status给出结果,服务器进程3110正在运行。但是
    pyro4 nsc list
    给出了结果,未能找到名称服务器:未能找到名称服务器我尚未使用pyro nsd。但是我会检查该文件的内容,看看它是如何初始化名称服务器的
    #!/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> - ppacory@gmail.com
    # 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