【问题标题】:Stuck at reusing code from parent package in Python坚持在 Python 中重用父包中的代码
【发布时间】:2022-08-18 15:50:54
【问题描述】:

我有一堆用于静态代码分析的脚本。

获取一个目录作为命令行参数,它们在该目录内的所有文件上运行。

这是我的项目的结构:

__init__.py
run.py
message.py
globals.py
react
    __init__.py
    run.py
    check_imports.py
    analyze_states.py
next
    __init__.py
    check_routes.py
    analyze_images.py
git
   __init__.py
   check_size.py
   ensure_branch_name.py
   run.py => how can I call this and still access message.py?

现在,如果我使用顶级run.py 作为编排器来调用子包中的子模块,那么一切正常,我可以在每个子模块中使用import message

但是对于git包,我想直接调用它。我想使用message.py 中定义的函数。我被困在这一点上。

我看到Python import from parent package 并尝试了from .. import message,但它不起作用。

  • 尝试从父文件夹运行它,例如python3 parentfolder/git/run.py

标签: python


【解决方案1】:

我发现的方法是 git 父文件夹位于您的 python 路径中。 一般来说,当我开发时,我会在您的 git/run.py 中添加这些行

import sys
sys.path.append('..')

然后你就可以import message

例如,当您完成开发并准备好使用 pip install 时,您需要确保该消息是您的 setup.py 中的可导入模块。

更新

'..' 仅在您从 git 存储库中执行 git/run.py 脚本或模块时才有效,因为 '..' 是相对路径。

如果你想在任何地方执行run.py,你可以:

import os
import sys

parent_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(parent_dir)

请记住,__file__ 仅在您以批处理模式执行 run.py 时才会存在不是来自交互式外壳或笔记本.

【讨论】:

  • 我对此进行了测试。但它没有用。即使在开发过程中它也不起作用。我必须将其更改为 sys.path.append('full-absolute-path-to-parent-here') 才能使其正常工作。
  • 这可能是因为您从git 目录之外执行run.py。此外,某些操作系统可能不接受“..”符号。请参阅上面的更新。基本上,您需要确保 message.py 模块所在的 git 的父目录位于您的 PYTHONPATH 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
相关资源
最近更新 更多