Python的路径引用
1、以HOME目录为准,进行跳转
1 2 3 4 5 | sys.path.append(os.path.dirname(__file__) + os.sep + '../' ) from config import swordfishconf from utils import log from utils.mysql_base import MySQLBase |
将程序的HOME目录添加到sys.path中,然后以此为准,进行跳转。
例子中对于封装的MySQLBase类访问是先访问utils包,然后从mysql_base.py中找到MySQLBase类
缺点:查看代码的时候当前脚本和包的关系不十分明了,需要调到HOME,然后再从HOME进行逐个查找
问题:如何直接看出当前脚本和包的关系,而不是经过HOME
2、使用absolute_path
配置PYTHONPATH:
1 | export PYTHONPATH=/data1/guosong/opdir/20141017/test:$PYTHONPATH |
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 | . |-- __init__.py |-- lib | |-- __init__.py | |-- pack1 | | |-- __init__.py | | |-- a.py | | `-- aa.py | `-- pack2 | |-- __init__.py | |-- b.py |-- test.py |
test.py的代码如下:
1 2 3 4 5 6 7 8 9 10 | [root@typhoeus79 ice_test_m test]# more test.py #!/usr/bin/env python2.7 #-*- coding:utf8 -*- from __future__ import absolute_import from lib.pack1.a import AObject if __name__ == '__main__': AObject.printword() |
从lib.pack1.a中引用类AObject,调用它的静态方法
a.py内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@typhoeus79 ice_test_m pack1] # more a.py #!/usr/bin/env python2.7 #-* coding:utf8 -*- from __future__ import absolute_import #from .a import BObject from ..pack2.b import BObject class AObject( object ): @classmethod def printword( self ): b = BObject( 'a call b class' ) |
a.py中又调用上一次目录pack2.b中的BObject
b.py内容为:
1 2 3 4 5 6 7 8 | [root@typhoeus79 ice_test_m pack2] # more b.py #!/usr/bin/env python2.7 #-* coding:utf8 -*- #from __future__ import absolute_import class BObject( object ): def __init__( self ,bstr): print "B:%s" % bstr |
好处:不用再经过HOME,直接根据相对路径进行跳转
3、absolute_path介绍
4、使用absolute_path遇到的问题
4.1、ValueError: Attempted relative import in non-package
包含相对路径import 的python脚本不能直接运行,只能作为module被引用。原因正如手册中描述的,所谓相对路径其实就是相对于当前module的路径,但如果直接执行脚本,这个module的name就是“__main__”, 而不是module原来的name, 这样相对路径也就不是原来的相对路径了,导入就会失败,出现错误“ValueError: Attempted relative import in non-package”
Note that both explicit and implicit relative imports are based on the name of the current module. Since the name of the main module is always"__main__", modules intended for use as the main module of a Python application should always use absolute imports.
在使用相对引用的文件中,不能有__main__方法,只执行作为一个module进行引用,而不是直接执行脚本。
4.2、 ValueError: Attempted relative import beyond toplevel package
test.py内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@typhoeus79 ice_test_m test] # more test.py #!/usr/bin/env python2.7 #-*- coding:utf8 -*- from __future__ import absolute_import from pack1.a import AObject from pack1.a import now if __name__ = = '__main__' : AObject.printword() print now |
其他均不变,但是将pack2和pack1的包迁移到外面出
1 2 3 4 5 6 7 8 9 10 11 12 | . |-- __init__.py |-- lib | |-- __init__.py |-- pack1 | |-- __init__.py | |-- a.py | `-- aa.py |-- pack2 | |-- __init__.py | |-- b.py |-- test.py |
运行test.py出错:
1 2 3 4 5 6 7 | [root@typhoeus79 ice_test_m test]# ./test.py Traceback (most recent call last): File "./test.py", line 7, in < module > from pack1.a import AObject File "/data1/guosong/opdir/20141017/test/pack1/a.py", line 6, in < module > from ..pack2.b import BObject ValueError: Attempted relative import beyond toplevel package |
处理方式是创建一个lib目录,将pack1和pack2拉到lib下面,修改test.py中的路径然后就ok了。
【参考资料】
1、http://blog.csdn.net/chinaren0001/article/details/7338041
2、http://hi.baidu.com/fleago/item/06b5c95765b17e12aaf6d79b
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
2013-10-17 mysql全日志(general log)的命令名称
2013-10-17 Python返回Json格式定义的例子
2013-10-17 Python_Ex:从文件读取SQL执行
2013-10-17 mysql多个TimeStamp设置(转)
2013-10-17 Scratch——教小孩子学编码
2013-10-17 Python之函数返回多个值