首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python文件位置约定和导入错误

Python文件位置约定和导入错误
EN

Stack Overflow用户
提问于 2011-06-11 02:53:50
回答 2查看 1.6K关注 0票数 0

我是Python新手,我只是不知道如何处理这个特定的问题:我正在尝试运行一个位于目录/opt/ros/diamondback/stacks/hrl/hrl_rfid/src/hrl_rfid/ros_M5e.py中的可执行文件(名为ros_M5e.py) (我知道,文件路径长得让人讨厌,但这是必须的)。但是,在ros_M5e.py文件中,有一个对位于文件路径上的另一个文件的调用:from hrl.hrl_rfid.msg import RFIDread。目录msg确实位于/opt/ros/diamondback/stacks/hrl/hrl_rfid/,并且它确实包含文件RFIDread。但是,每当我尝试执行ros_M5e.py时,我都会得到这样的错误:

Traceback (most recent call last): File "/opt/ros/diamondback/stacks/hrl/hrl_rfid/src/hrl_rfid/ros_M5e.py", line 37, in <module> from hrl.hrl_rfid.msg import RFIDread ImportError: No module named hrl.hrl_rfid.msg

能不能请一些有专业知识的人帮我解释一下这个问题?这似乎只是一个基本的文件位置问题,但我只是不知道适当的Python约定来解决它。我尝试将ros_M5e.py文件放在它调用的文件所在的目录中,并更改文件路径,但都无济于事。

非常感谢,

Khiya

EN

回答 2

Stack Overflow用户

发布于 2011-06-14 02:29:47

当然,我可以帮助您启动和运行它。

从StackOverflow的帖子来看,您似乎是在将堆栈签出到/opt/ros/diamondback。这是不好的,因为它是一个系统路径。您需要安装到本地路径中。在存储库上使用"readonly“的原因是您没有更改代码的权限--它在您的本地计算机上仍然可以很好地工作。我在这里花了相当多的时间来展示如何使用这个包(至少是python版本):

代码语言:javascript
复制
http://www.ros.org/wiki/hrl_rfid

我会试着快速安装它。运行以下命令:

代码语言:javascript
复制
cd
mkdir sandbox
cd sandbox/
svn checkout http://gt-ros-pkg.googlecode.com/svn/trunk/hrl/hrl_rfid hrl_rfid  (double-check that this checkout works OK!)

将以下行添加到bashrc的底部,以告诉ROS在哪里可以找到新的包。(您可以使用"gedit ~/.bashrc")

代码语言:javascript
复制
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$HOME/sandbox/hrl_rfid

现在执行以下命令:

代码语言:javascript
复制
roscd hrl_rfid  (did you end up in the correct directory?)
rosmake hrl_rfid  (did it make without errors?)
roscd hrl_rfid/src/hrl_rfid

在这一点上,实际上一切都安装正确了。默认情况下,ros_M5e.py假定读取器位于"/dev/robot/RFIDreader“。除非您已经修改了udev规则,否则在您的机器上不会出现这种情况。我建议遍历代码:

代码语言:javascript
复制
http://www.ros.org/wiki/hrl_rfid 

使用iPython (一个命令行python提示符,允许您一次执行一个python命令)来确保一切正常(将/dev/ttyUSB0替换为连接您的RFID读取器的任何设备):

代码语言:javascript
复制
import lib_M5e as M5e

r = M5e.M5e( '/dev/ttyUSB0', readPwr = 3000 )
r.ChangeAntennaPorts( 1, 1 )
r.QueryEnvironment()

r.TrackSingleTag( 'test_tag_id_' )
r.ChangeTagID( 'test_tag_id_' )
r.QueryEnvironment()
r.TrackSingleTag( 'test_tag_id_' )

r.ChangeAntennaPorts( 2, 2 )
r.QueryEnvironment()

这意味着底层库工作得很好。接下来,测试ROS (确保"roscore“正在运行!),方法是将以下代码放入python文件并执行:

代码语言:javascript
复制
import lib_M5e as M5e

def P1(r):
    r.ChangeAntennaPorts(1,1)
    return 'AntPort1'

def P2(r):
    r.ChangeAntennaPorts(2,2)
    return 'AntPort2'

def PrintDatum(data):
    ant, ids, rssi = data
    print data

r = M5e.M5e( '/dev/ttyUSB0', readPwr = 3000 )
q = M5e.M5e_Poller(r, antfuncs=[P1, P2], callbacks=[PrintDatum])
q.query_mode()

t0 = time.time()
while time.time() - t0 < 3.0:
    time.sleep( 0.1 )

q.track_mode( 'test_tag_id_' )

t0 = time.time()
while time.time() - t0 < 3.0:
    time.sleep( 0.1 )

q.stop()

好了,现在一切正常了。您可以根据您的设置创建自己的节点:

代码语言:javascript
复制
#!/usr/bin/python
import ros_M5e as rm

def P1(r):
    r.ChangeAntennaPorts(1,1)
    return 'AntPort1'

def P2(r):
    r.ChangeAntennaPorts(2,2)
    return 'AntPort2'

ros_rfid = rm.ROS_M5e( name = 'my_rfid_server',
                       readPwr = 3000,
                       portStr = '/dev/ttyUSB0',
                       antFuncs = [P1, P2],
                       callbacks = [] )

rospy.spin()
ros_rfid.stop()

或者,对我执行ping命令,我可以调整ros_M5e.py以获取一个可选的"portStr“--尽管我建议您自己设置天线,以便您可以合理地命名天线。此外,我强烈建议设置udev规则,以确保RFID读取器始终分配给同一设备:http://www.hsi.gatech.edu/hrl-wiki/index.php/Linux_Tools#udev_for_persistent_device_naming

代码语言:javascript
复制
BUS=="usb", KERNEL=="ttyUSB*", SYSFS{idVendor}=="0403", SYSFS{idProduct}=="6001", SYSFS{serial}=="ftDXR6FS", SYMLINK+="robot/RFIDreader" 

如果你不这么做..。不能保证读取器总是在/dev/ttyUSBx处枚举。

如果你还有什么问题,请告诉我。

~特拉维斯·德伊尔(Hizook.com)

PS --您是否将ros_M5e.py修改为“从hrl.hrl_rfid.msg导入RFIDread"?在存储库中,它是"from hrl_rfid.msg import RFIDread“。后者是正确的。只要您正确地定义了ROS_PACKAGE_PATH,并且已经在包上运行了rosmake,那么import语句就应该可以正常工作。此外,我不建议在StackOverflow上发布与ROS相关的问题。这里几乎没有人会熟悉ROS生态系统(这是非常复杂的)。请在此处发布问题:

代码语言:javascript
复制
http://answers.ros.org/
http://code.google.com/p/gt-ros-pkg/issues/list
票数 1
EN

Stack Overflow用户

发布于 2011-06-11 02:59:28

您需要确保以下情况属实:

  • Directory /opt/ros/diamondback/stacks/在您的python中path.
  • /opt/ros/diamondback/stacks/hr1包含__init__.py
  • /opt/ros/diamondback/stacks/hr1/hr1_rfid contians __init__.py
  • /opt/ros/diamondback/stacks/hr1/hr1_rfid/msg contians __init__.py

正如发问者在评论中解释的那样,RFIDRead没有.py扩展,所以这里是如何导入的。

代码语言:javascript
复制
import imp
imp.load_source('RFIDRead', '/opt/ros/diamondback/stacks/hr1/hr1_rfid/msg/RFIDRead.msg')

有关更多信息,请查看imp documentation

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6310828

复制
相关文章

相似问题

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