
有没有更好的方法来组织我的应用程序或我的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 indivIDuallyclass Child(Base): def hello(self): print 'Hello,world!'if __name__ == '__main__': import unittest # ... unit test code ...
user.py
from spam.morespam.child import Childprint 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文件夹中,因此它不是特定于应用程序的.
>我可以temporarily add my application root to the PYTHONPATH,并使我的所有模块从根目录引用包.但是,通过简单地调用python.exe whatever.py,这就消除了运行脚本的简单性.
>我可以编写某种模块,在导入时,会在我的应用程序的根文件夹中查找标记文件.然后可以将此通用模块安装到我的本地Python安装并由我的应用程序中的每个模块导入,从而保证根目录在PYTHONPATH中,无论我正在执行哪个模块.
\spam \morespam __init__.py child.py __init__.py base.py\eggs __init__.py user.py
执行此 *** 作并将PYTHONPATH建立到此目录的基础之后,您可以执行导入:
base.py:
from morespam.child import Childfrom ..eggs import user
虽然只需要存在__init__.py文件,但您也可以将此文件中的变量__ALL__定义为该目录中当脚本尝试使用import *时要导入的模块列表.
总结以上是内存溢出为你收集整理的特定于应用程序的PYTHONPATH全部内容,希望文章能够帮你解决特定于应用程序的PYTHONPATH所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)