当我从模块内部运行文件时,文件导入正在工作,但当我通过从外部导入模块来运行文件时则不起作用

Posted

技术标签:

【中文标题】当我从模块内部运行文件时,文件导入正在工作,但当我通过从外部导入模块来运行文件时则不起作用【英文标题】:A file import is working when I run the file from inside the module, but not when I run the file by importing the module from outside 【发布时间】:2019-06-14 09:27:29 【问题描述】:

我的目录结构:

test.py
module/
    importer.py
    importee.py
    __init__.py

所以在我的目录中,我有 test.py,然后是另一个已初始化为模块的目录。在该模块中,有一个 importer.py 文件,它导入了一个 importee.py 文件。为了测试导入是否有效,我在 importee.py 中做了一个简单的函数,并尝试在 importer.py 中使用它(即我直接运行 importer.py);它工作得很好。

但是当我进入 test.py 并有 import 语句 from module import * 并尝试运行它(没有任何其他代码)时,它给出了一个错误,可以追溯到 importer.py 中的 import 语句,说 @987654327 @

如果重要,module 目录中的__init__.py 具有正确指定的__all__ 函数。

我认为这不是重复的,尽管有类似标题的帖子,例如 this 或 this 或 this 或 this;我一直在寻找几个小时,但仍然不知道是什么原因造成的。

有什么想法吗?非常感谢任何帮助。

编辑:四个文件的内容:

init.py

__ all __ = ["importee", "importer"]

importee.py

def example():
    print("hey")

importer.py

from importee import * 
example()

test.py

from module import * 

当我运行 importer.py 时,我没有收到任何错误,但是当我运行 test.py 时,我收到一个错误,该错误可以追溯到 importer.py 的第一行,说 No module named 'importee' found,即使我不明白直接运行importer.py时出错...

【问题讨论】:

如果您概述所有四个.py 文件的内容(即使您编写它们的简化版本),这会更清楚 @CharlesLandau 抱歉,一开始应该这样做,现在我已经编辑了它们。 【参考方案1】:

无论您是从 root 运行 python test.py 还是从 module 运行 python importer.py,以下运行并打印“嘿”。

您可以了解有关从 PEP 328 导入的更多信息。您可以了解有关 init here 的更多信息,但我希望您从中了解的重要一点是,当您从 module 导入时,__init__ 会运行。

此外,定义__all__ 会覆盖以_ 开头的标识符,并且由于您没有使用它们,我实际上并不知道它会产生任何影响。

# test.py
from module import *

# module/__init__.py
from .importer import * 

# module/importee.py
def example():
    print("hey")

# module/importer.py
from .importee import *

example()

【讨论】:

感谢您的回复。我有点难以理解。您是否建议我在__init__.py 中的模块中的每个文件中都有导入语句?那会有什么作用吗?此外,问题不在于我无法将模块导入 test.py,而是当我出于某种原因导入它时 importer.py 中使用的导入之一(在模块本身内 i>) 不起作用(即使如果我直接运行 importer.py 导入就可以正常工作)。 我编辑了我的答案@JamesRonald,希望能更好地解决您的问题。你在澄清方面做得很好

以上是关于当我从模块内部运行文件时,文件导入正在工作,但当我通过从外部导入模块来运行文件时则不起作用的主要内容,如果未能解决你的问题,请参考以下文章

SQLite - 每天将 .csv 数据导入数据库

py项目工作,但pyinstaller给出了与pulp相关的错误信息。

FMDB 不能快速工作?

如何导入vscode路径

当我从 Azure 函数而不是从控制台应用程序运行 LINQ 查询时,它会失败

CodeIgniter 500 内部服务器错误