【问题标题】:How can I skip intermediate folders in Python imports?如何在 Python 导入中跳过中间文件夹?
【发布时间】:2020-03-30 21:02:03
【问题描述】:

我的 python 应用程序的文件夹结构如下:

my_repo/
  src/
    main.py
    util/   <-- util is a git submodule
      src/
        torgle.py
      test/
        test_torgle.py
  test/
    test_main.py

main.py 中,我可以像这样在util 子模块中导入东西:

from util.src.torgle import Torgler

src/ 只是在我的 git 子模块存储库中保持事物组织的一种方式,不应该是主存储库中包名称的逻辑部分。有什么方法可以跳过模块导入的src 部分吗?我宁愿这样做:

from util.torgle import Torgler

即我可以本质上将 util/src 文件夹别名为 Python util 包吗?

(请注意,在我的实际案例中,我有更深的嵌套包 (util.x.y.z.torgle),因此 from util import torgle; torgle.Torgler(...) 无法很好地扩展。我对 from util.torgle import Torgler 特别感兴趣。)

【问题讨论】:

  • 您是否有任何理由直接从存储库构建 Python 应用程序,而不是安装它并在此过程中合并存储库目录?
  • @MisterMiyagi 我不是 Python 专家——你能多说一下“安装它”是什么意思吗?为了澄清我的情况,my_repoutil 都是我自己的存储库; util 在多个项目之间共享。因此,如果有更好的方法来管理它(并且仍然允许我从 utilfrom util.torgle ... 导入),我绝对是灵活的。
  • 您知道setup.pyPYTHONPATH 吗?基本上,您可以将代码合并到一个可安装的包中,或者调整 Python 加载模块的方式。

标签: python python-3.x git-submodules


【解决方案1】:

您可以通过添加 my_repo/src/util/__init__.py 并向其中添加以下行来执行此操作:

from .src import torgle

然后您将能够执行以下操作:

from util import torgle
torgle.Torgler(...)

【讨论】:

  • 效果很好,但不幸的是只有一个级别,如此处所示。在我的真实案例中,我有更深的嵌套包(util.x.y.z.torgle),所以我相信使用这种技术我必须做from util import x; x.y.z.torgle.Torgler(...),对吧?所以我特别有兴趣让from util.torgle import Torgler 工作。我已经更新了问题以澄清这一点。
【解决方案2】:

我的解决方案基于操作系统技巧,而 Benjamin Rowell 的解决方案是特定于 python 的并且非常优雅。我建议先看看它。


解决方案是符号链接

说明

你的情况应该如下:

实际库位于useless_dir 中,但您想直接访问它。

如果要从主文件中导入library.py,标准方式是:

from useful_dir.useless_dir.library import p_func

p_func()

然后,当你调用 main.py 时:

python3 main.py  # Hello World!

这是您要寻找的技巧:

1) 将自己置于useful_dir 文件夹中:

2) 在这个目录中创建一个符号链接:

ln -s useless_dir/library.py any_name_for_the_library.py

3) 相应更改主要内容:

from useful_dir.any_name_for_the_library import p_func

p_func()

结束

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 2020-01-14
    • 2015-03-20
    • 2018-10-21
    相关资源
    最近更新 更多