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

2024-09-28 19:26:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个具有固定结构的大型存储库,并通过一些文件夹和python脚本对其进行了扩展,从而为其整体添加了额外的功能。结构如下:

  • 顶级文件夹
    • 羽毛粉
      • 某物
      • __初始值
    • 特点b
      • 某物模组b.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

现在我可以看到,当从toplevelfolder调用python时,相对导入将导致问题,因为..将表示后者的父目录,而不是featureA的父目录。但是,我无法获得第一条错误消息,特别是因为toplevelfolder不应该是一个模块,而应该是一个包

如果可能的话,在不修改PYTHONPATH或sys.path或类似的东西的情况下,有没有其他我不知道的导入Python的方法


Tags: 模块frompyimport目录脚本文件夹app
3条回答

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

  1. 清楚地确定您希望顶级模块和软件包是什么

  2. 使所有进口成为绝对进口

  3. 要么:

    • 使您的项目成为一个真正的可安装项目,以便将这些顶级模块和包安装在环境的site-packages目录中
    • 或者确保当前工作目录是包含顶级模块和包的目录
  4. 如果要执行的“入口点”是的一部分,请确保通过可执行模块或包方法而不是脚本方法调用代码

    • DO(可执行模块或包):
      • path/to/pythonX.Y -m toplevelpackage.module
      • path/to/pythonX.Y -m toplevelpackage.subpackage(假设有一个toplevelpackage/subpackage/__main__.py文件)
    • 不要(在包中编写脚本):
      • path/to/pythonX.Y toplevelpackage/module.py
  5. (可选)稍后,一旦一切正常,一切都在控制之下,您可能会决定将部分或全部导入更改为相对导入。(如果事情做对了,我相信这是可能的,这样就可以从目录结构中的任何级别调用可执行模块作为当前工作目录。)

参考文献:

尝试将其粘贴到导入上方:

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) 

然后您应该能够从父文件夹导入文件

不要包含顶级目录。在功能B.someModuleB中:

from featureA.someModuleA import two

Sample directory.

相关问题 更多 >