gpt4 book ai didi

python - 特定于应用程序的 PYTHONPATH

转载 作者:太空宇宙 更新时间:2023-11-03 11:56:45 24 4
gpt4 key购买 nike

我有一个包含包层次结构的应用程序。有相当多的模块引用包层次结构中更高层的其他模块。如下所示,我可以使用相对导入来解决这个问题。但是,直接运行模块进行测试失败,并出现 Attempted relative import in non-package 异常。

有没有更好的方法来组织我的应用程序或我的导入语句,以便模块可以单独执行以进行测试并从其他模块导入?

例子

\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 ...

用户.py

from spam.morespam.child import Child
print Child().hello()

现有解决方案

我发现我可以将以下 header 添加到需要引用层次结构中较高模块的模块的顶部:

if __name__ == '__main__':
import sys, os
sys.path.append(os.path.abspath(os.path.join(sys.path[0], '..')))

缺点是我需要在所有地方添加这段代码,而且它不是恒定的:'..' 相对路径根据包在层次结构中的深度而变化.

其他可能的解决方案...

  1. 我可以用我的应用程序根目录创建一个 .pth 文件。不幸的是,这必须添加到我的 Python 安装的 site-packages 文件夹中,所以它不是特定于应用程序的。
  2. 我可以 temporarily add my application root to the PYTHONPATH ,并使我所有的模块从根目录引用包。不过,这消除了通过简单地调用 python.exe whatever.py 来运行脚本的简单性。
  3. 我可以编写某种模块,当导入时,它会在我的应用程序的根文件夹中查找标记文件。然后可以将该通用模块安装到我的本地 Python 安装中,并由我的应用程序中的每个模块导入,从而保证根位于 PYTHONPATH 中,无论我正在执行哪个模块。

最佳答案

您需要将 __init__.py 添加为要从中导入的文件夹中的空文件。这样做会导致 python 将目录视为包,允许您在导入语句中使用它们:

\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 *,d 想要导入。

关于python - 特定于应用程序的 PYTHONPATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6785496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com