【问题标题】:System Paths and Modules系统路径和模块
【发布时间】:2013-07-16 09:21:27
【问题描述】:

我有以下设置:

/project/
    /api/
        __init__.py
        test.py
    /modules/
        __init__.py
        api.py

我正在尝试从 /project/ 目录运行 api.py:python modules/api.py

api 模块尝试从 api 包中导入测试模块,但失败。我尝试了以下方法:

import api.test
import project.api.test  # (with an __init__.py in my /project/ directory)

我什至尝试将 api 包的父目录添加到系统路径,如下所述:

import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

问题

如何设置我的项目,使每个包都知道其父目录中的其他包,该父目录也是项目的根目录?

【问题讨论】:

  • 您不需要递归地将所有目录添加到系统路径吗? api.py 位于子目录中。你为什么使用os.path.dirname(os.path.dirname(..))?只是选择逻辑。我之前没用过os.path.dirname
  • 逻辑是我想要文件本身的目录,然后我想要那个目录的目录。相当于请求文件的父目录 :D

标签: python directory filesystems package python-module


【解决方案1】:

您的问题是您有一个 project/modules/api.py file 以及一个带有 __init__.py 文件的 projects/api 目录 - 您正在获取描述符碰撞。将其中一个重命名为其他名称,您的代码应该可以工作:

/project/
    /api/
        __init__.py
        test.py
    /modules/
        __init__.py
        foo.py

然后在 foo.py 中运行python modules/foo.py

from ..api import test

或者:

import sys
import os
sys.path.append(os.path.abspath('../api'))
import test

【讨论】:

  • 不需要 ..api。您最初的解决方案是最好的:我将 /module/api.py 重命名为 /module/apihandler.py 并且它现在正在运行。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 2017-10-18
  • 2020-04-18
  • 2013-02-21
  • 2011-05-22
  • 2011-09-30
  • 2019-09-24
相关资源
最近更新 更多