当脚本从不同的文件夹(祖先)运行时,Python导入

问题描述 投票:1回答:2

我有一个大的仓库,有一些固定的结构,我通过一些文件夹和python脚本来扩展它,为它增加额外的功能。其结构如下。

  • toplevelfolder
    • 特征A
      • someModuleA.py
      • __ init __.py
    • 特征B
      • someModuleB.py
      • __ init __.py
    • 应用
    • __ init __.py
    • app.py

现在 someModuleA.pysomeModuleB.py 可以通过 app.py 但同时也可以直接调用,但是这个调用必须来自toplevelfolder,以使文件中的相对路径正确解析,即:通过 python ./featureA/someModuleA.py.

这一切都很好,但现在我需要一些来自于 someModuleBsomeModuleA 因此我想导入这个模块。我尝试了绝对导入和相对导入,但都以不同的错误而失败,绝对导入时用了

from toplevelfolder.featureA import someModuleA as A

# ModuleNotFoundError: No module named 'toplevelfolder'

和相对导入

from toplevelfolder.featureA import someModuleA as A

# ImportError: attempted relative import with no known parent package

现在我可以看到,当python从 toplevelfolder作为 .. 将代表后者的父目录,而不是代表父目录的 featureA. 然而,我无法掌握第一条错误信息,特别是因为 toplevelfolder 不应该是一个模块,而应该是一个包。

有没有其他方法可以在Python中导入我不知道的东西,如果可能的话,不用修改PYTHONPATH或sys.path之类的东西?

python python-import python-module python-packaging
2个回答
0
投票

我不是100%确定这里的目标是什么。我的建议是

  1. 清楚地确定你想让你的顶层模块和包是什么。

  2. 让所有的导入都是绝对的。

  3. 或者

    • 让你的项目成为一个真正的可安装的项目 这样那些顶层模块和包就会被安装在环境中。site-packages 目录。
    • 或确保当前工作目录是包含顶级模块和包的目录。
  4. 确保通过 可执行模块 方法,而不是 脚本 办法

    • path/to/pythonX.Y -m toplevelpackage.module DO
    • path/to/pythonX.Y toplevelpackage/module.py 不要
    • path/to/pythonX.Y -m toplevelmodule DO
    • path/to/pythonX.Y toplevelmodule.py 不要
    • path/to/pythonX.Y -m toplevelpackage.subpackage DO(假设有 toplevelpackage/subpackage/__main__.py 文件)。)
  5. 稍后,一旦一切顺利,一切都在控制之中,你可能会决定将部分或全部导入改为相对导入。(如果事情做得很好,我相信有可能使它可以从目录结构中的任何级别调用可执行模块作为当前工作目录。)

参考文献。


-1
投票

试试把这个粘贴到你的导入上面。

import os,sys,inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir) 

然后你就可以从父文件夹中导入一个文件。

© www.soinside.com 2019 - 2024. All rights reserved.