首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Pyro-nsd时找不到Pyro Nameserver

使用Pyro-nsd时找不到Pyro Nameserver
EN

Stack Overflow用户
提问于 2014-10-21 21:15:30
回答 2查看 2K关注 0票数 2

我在运行Wheezy的Raspberry Pi上使用Python2.7的Pyro4

当我启动Pyro Nameserver时

代码语言:javascript
复制
pyro4-ns &

代码语言:javascript
复制
python -m Pyro4.naming &

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

代码语言:javascript
复制
/etc/init.d/pyro-nsd start

当我将lamp_daemon.py作为后台进程启动时

代码语言:javascript
复制
/home/pi/Wakeup-Lamp/lamp_daemon.py &

我得到以下错误

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

lamp_daemon.py代码是

代码语言:javascript
复制
#!/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()

我已经搜索了相当多,但我似乎不能解决这个问题。有人知道我做错了什么吗?

EN

回答 2

Stack Overflow用户

发布于 2015-06-30 05:58:37

如果服务器上的pyro版本与客户机上的Pyro版本不同,则无法找到名称服务器,下面是检查Pyro版本的一种方法:

python -c“将Pyro4常量导入为c;print(c.PROTOCOL_VERSION)"

如果情况不一样,请卸载pyro模块并重新安装。

我面临着一个类似的问题,当我遵循上述步骤时,这个问题是固定的。

票数 1
EN

Stack Overflow用户

发布于 2014-10-21 22:02:21

我不确定这是否能完全解决您的问题,但下面是我在尝试让pyro-nsd使用python2.7时学到的东西。在本例中,我使用了Ubuntu14.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。如果是的话,它将使用python3版本的pyro4,该版本作为sudo apt-get install pyro4的依赖项安装。

在这里,我让它使用python2.7

现在pyro4-nsc list确实有效了,但是我得到了一个错误:Error: CommunicationError - cannot connect: hmac key config not symmetric,这导致了第二个错误

2.

接下来我注意到的是export PYRO_HMAC_KEY=12345行在pyro4-nsd中。

Pyro4/configuration.py文件中,这似乎只用于python3:(https://github.com/delmic/Pyro4/blob/ccea9c2870a1280010bcc56f4146bc1617ec6e8d/src/Pyro4/configuration.py#L81)。在这里看到这个片段:

代码语言:javascript
复制
    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之外,次要的事情是启动服务,然后停止服务,当它应该停止服务,然后启动它。

下面是修改后的py4-nsd文件:

代码语言:javascript
复制
#!/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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26496474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档