【问题标题】:Import package from within package directory从包目录中导入包
【发布时间】:2018-02-28 18:32:31
【问题描述】:

我目前正在使用以下目录结构:

package/
    __init__.py
    MainModule.py
    Module2.py
    run.py

使用 Python 3,我了解到为了让 MainModule 导入 Module2,我需要使用显式相对导入(即 import .Module2)。但是,以前我通过将MainModule 作为脚本运行来测试这些文件,在这种情况下我得到了

系统错误:父模块''未加载,无法执行相对导入

根据 Guido 的说法,我从 this answer 了解到,将模块作为脚本运行是一种 hackish 和 unpythonic。因此,我添加了run.py,这很简单:

import sys
sys.path.append('/path/to/package-superdirectory')
from package.MainModule import main

main()

由于某种原因,当我运行 run.py 时,我得到了

ImportError: 没有名为 'package.MainModule' 的模块; “包”不是包

有没有办法可以使用package/ 中的脚本运行MainModule?出于组织目的,我需要 package/ 目录中的脚本,并且我需要 MainModule 才能使用显式相对导入。这些文件将放入库中,但它们目前不在 PYTHONPATH 上,所以据我所知 python3 -m 不会在这里工作。

更新:

我需要从特定目录/other/dir 运行此特定脚本,因此答案需要能够从任何地方运行run.py(或MainModule)。

【问题讨论】:

  • 尝试从/path/to/package-superdirectory运行python3 -m package.MainModule
  • @vaultah 查看我的更新;我尝试运行你所说的,但它吐出No module named package.MainModule

标签: python python-3.x python-import python-module


【解决方案1】:

你创造了 初始化.py 在/包中?

编辑: 尝试使用from .MainModule import main

【讨论】:

  • 是的,但它是空的。里面有什么具体的需要吗?
  • 不,应该是空的。
【解决方案2】:

所以我想出了如何让它发挥作用。由于我的环境中有一个package(它是同一个包的稳定版本),我不得不在package的超级目录上方添加路径。所以我的run.py 现在看起来像:

#!/usr/bin/env python3
import sys
sys.path.append('/path/to')
from package-superdirectory.package.MainModule import main

main()

如果package 中的所有模块都使用显式相对导入(即import .Module2),则调用./run.py 将正确运行MainModule

【讨论】:

    猜你喜欢
    • 2016-12-27
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多