使用 Pyro-nsd 时找不到 Pyro Nameserver
Posted
技术标签:
【中文标题】使用 Pyro-nsd 时找不到 Pyro Nameserver【英文标题】:Can't find Pyro Nameserver when using Pyro-nsd 【发布时间】:2014-10-21 21:15:30 【问题描述】:我在运行 Wheezy 的 Raspberry Pi 上使用 Pyro4 和 Python 2.7
当我启动 Pyro Nameserver 时
pyro4-ns &
或
python -m Pyro4.naming &
我的代码按预期工作,没有任何错误。但是,当我使用以下命令启动 Pyro 名称服务器守护程序时
/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 行,位于 locateNS 提高电子 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()
我用谷歌搜索了很多,但似乎无法解决问题。有没有人知道我做错了什么?
【问题讨论】:
也许可以尝试运行此命令来查看名称服务器是否正在运行:pyro4-nsc list
有趣,/etc/init.d/pyro-nsd
status 给出了结果,服务器进程 3110 正在运行。但是pyro4-nsc list
给出的结果是,无法找到名称服务器:无法找到名称服务器
我还没用过pyro-nsd。但我会检查该文件的内容,看看它是如何初始化名称服务器的。
我认为一个可能的问题是因为 pyro-nsd 脚本检查是否安装了 python3。如果安装了python3,它将使用pyro4的python3版本。
【参考方案1】:
如果服务器端的 pyro 版本与客户端不同,则无法找到名称服务器,这里有一个检查 Pyro 版本的方法:
python -c "import Pyro4.constants as c; print(c.PROTOCOL_VERSION)"
如果不一样,请卸载pyro模块并重新安装。
我遇到了一个类似的问题,当我按照上述步骤解决时。
【讨论】:
【参考方案2】:我不确定这是否能完全解决您的问题,但这是我在尝试让pyro-nsd
与 python2.7 一起工作时学到的。在这种情况下,我使用了 Ubuntu 14.04。 Wheezy 版本可能会有所不同。
-
我使用
sudo apt-get install pyro4
安装,因为pyro4-nsd
不是通过pip 安装的。
我注意到的第一件事是 pyro4-nsc list
未被识别。
然后我使用 sudo pip install pyro4
进行 pyro4。
现在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
2.
接下来我注意到的是pyro4-nsd
中的export PYRO_HMAC_KEY=12345
行。
在Pyro4/configuration.py
文件中,这似乎只用于python3:(https://github.com/delmic/Pyro4/blob/ccea9c2870a1280010bcc56f4146bc1617ec6e8d/src/Pyro4/configuration.py#L81)。在此处查看此 sn-p:
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
,当它应该停止服务然后启动它时,启动然后停止服务。
这里是修改后的 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
【讨论】:
谢谢@Gohn67 我今晚回家后试试看以上是关于使用 Pyro-nsd 时找不到 Pyro Nameserver的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 animateWithDuration 时找不到方法 '+animateWithDuration:delay:options:animations:'