特定于应用程序的PYTHONPATH
我有一个包含层次结构的应用程序.有许多模块可以引用包层次结构中更高层的其他模块.如下所示,我可以使用相对导入来解决这个问题.但是,直接运行模块进行测试失败,并在非程序包异常中使用Attempted相对导入.
有没有更好的方法来组织我的应用程序或我的import语句,以便模块可以单独执行测试和从其他模块导入? 例 spam morespam child.py base.py eggs user.py base.py class Base(object): def hello(self): print 'Um,wot?' child.py from ..base import Base # references the parent package correctly,# but fails when this module is executed individually class Child(Base): def hello(self): print 'Hello,world!' if __name__ == '__main__': import unittest # ... unit test code ... user.py from spam.morespam.child import Child print Child().hello() 现有解决方案 我发现我可以添加以下标头添加到需要引用层次结构中较高模块的模块的顶部: if __name__ == '__main__': import sys,os sys.path.append(os.path.abspath(os.path.join(sys.path[0],'..'))) 缺点是我需要在整个地方添加此代码,并且它不是常量:“..”相对路径根据层次结构中包的深度而变化. 其他可能的方案… >我可以用我的应用程序root创建一个.pth文件.不幸的是,这必须添加到我的Python安装的site-packages文件夹中,因此它不是特定于应用程序的. 解决方法
您需要将__init__.py添加为要从中导入的文件夹中的空文件.这样做会导致python将目录视为包,允许您在import语句中使用它们:
spam morespam __init__.py child.py __init__.py base.py eggs __init__.py user.py 执行此操作并将PYTHONPATH建立到此目录的基础之后,您可以执行导入: base.py: from morespam.child import Child from ..eggs import user 虽然只需要存在__init__.py文件,但您也可以将此文件中的变量__ALL__定义为该目录中当脚本尝试使用import *时要导入的模块列表. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |