【问题标题】:Importing From Another Script in Python从 Python 中的另一个脚本导入
【发布时间】:2020-11-17 04:09:55
【问题描述】:

我的目录是这样的:

isds:
__init__.py
    jobs:
    __init__.py
        adhoc:
        __init__.py
        test.py
        test2.py

我的两个文件是这样的。

test.py:

import sys

x = 10

test2.py:

import sys
from isds.jobs.adhoc.test import *

print(x)

当我从与 test2.py 相同的目录运行“python3 test2.py”时,我收到此错误:ModuleNotFoundError: No module named 'isds.jobs.adhoc.test'

为什么会这样?我有 init.py 文件,我认为我的绝对导入语句是正确的......但也许不是?

谢谢!

【问题讨论】:

  • 因为 Python 没有理由将父目录 isds 视为查找模块或包的地方。您应该使用相对导入从同一个包中获取代码。
  • 这能回答你的问题吗? Relative imports in Python 3
  • 为什么不使用from test import *,因为它在同一个目录中
  • 大家好,是的,{from test import *} 确实有效!所以,我知道问另一个问题不是最好的礼仪,但我正在推断我面临的真正问题:所以,假设 test2.py 位于:“isds.jobs2.adhoc2.test2.py”并假设应该有 init.py 文件。导入语句不应该是“from isds.jobs.adhoc.test import *”吗?我仍然收到与之前报告的相同的错误。
  • @fjjones88 question linked by Karl 给出了使用-m 标志运行它的“正确”方式作为已接受答案的一部分,如果你有的话,我已经在此处发布了具体用例作为答案如有任何进一步的问题或澄清,请随时对我的回答发表评论。

标签: python python-3.x import


【解决方案1】:

由于您是从同一目录导入模块,因此您可以简单地使用导入。

from test import *

【讨论】:

  • 不错!那行得通。因此,假设 test2.py 位于此处:“isds.jobs2.adhoc2.test2.py”并假设应该有 init.py 文件。导入语句不应该是“from isds.jobs.adhoc.test import *”吗?我仍然收到与之前报告的相同的错误。
  • Python 在 import 语句中使用相对路径。因此,如果您从 isds 的父目录运行文件。那么你必须给出这样的完整路径 isds.jobs2.adhoc2.test2
【解决方案2】:

为了作为包导入,您需要将文件作为包运行,因此您需要导航到包含 isds` 的文件夹并运行:

python -m isds.jobs.adhoc.test2

这会将文件作为模块而不是脚本运行,并且由于它在使用其自己的导入的同一级别被索引,因此您使用的导入机制按预期工作。

如果你想支持作为脚本运行或作为模块运行,你需要这样的东西:

try:
    from isds.jobs.adhoc.test import *
except ModuleNotFoundError:
    from test import *

但这可能会导致其他问题,例如如果发生未找到不同模块的错误,然后 import test 最终完全导入其他内容,您可能会收到令人困惑和误导性的错误消息,因此我通常建议您只运行所有内容如果您正在编写包,请使用 -m 标志。

另请注意,此方法在 python 3.7,4 中没有任何 __init__.py 文件时有效。我相信不久前删除了添加空初始化文件的要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-15
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 2017-06-29
    • 2015-04-11
    相关资源
    最近更新 更多