特定于应用程序的PYTHONPATH

特定于应用程序的PYTHONPATH,第1张

概述我有一个包含层次结构的应用程序.有许多模块可以引用包层次结构中更高层的其他模块.如下所示,我可以使用相对导入来解决这个问题.但是,直接运行模块进行测试失败,并在非程序包异常中使用Attempted相对导入. 有没有更好的方法来组织我的应用程序或我的import语句,以便模块可以单独执行测试和从其他模块导入? 例 \spam \morespam child.py ba 我有一个包含层次结构的应用程序.有许多模块可以引用包层次结构中更高层的其他模块.如下所示,我可以使用相对导入来解决这个问题.但是,直接运行模块进行测试失败,并在非程序包异常中使用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 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中,无论我正在执行哪个模块.

解决方法 您需要将__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 Childfrom ..eggs import user

虽然只需要存在__init__.py文件,但您也可以将此文件中的变量__ALL__定义为该目录中当脚本尝试使用import *时要导入的模块列表.

总结

以上是内存溢出为你收集整理的特定于应用程序的PYTHONPATH全部内容,希望文章能够帮你解决特定于应用程序的PYTHONPATH所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1196526.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-03
下一篇2022-06-03

发表评论

登录后才能评论

评论列表(0条)

    保存