Python Can';使用Pyro nsd时找不到Pyro名称服务器
我将Pyro4与Python2.7一起用于Raspberry Pi running Wheezy 当我启动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-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安装的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