从另一个目录导入在 Python 中失败

我读到要使用python文件作为导入模块,我需要放在__init__.py目录中。


我有以下目录结构:


data_load

    -- __init__.py

    -- rand_data.py


etc 

    -- __init__.py

    -- test.py

在 test.py 中,我导入了一个在 rand_data 中定义的类,我得到了错误:


python test.py 

Traceback (most recent call last):

  File "test.py", line 8, in <module>

    from data_load.rand_data import RandData

ModuleNotFoundError: No module named 'data_load'


MYYA
浏览 232回答 2
2回答

慕慕森

切换到 etc 和 data_load 的父目录并输入python -m etc.test这应该可以完成这项工作。这是一个小测试用例(假设你在一台 linux 机器上)## create the test casemkdir -p import_issue/data_load import_issue/etctouch import_issue/data_load/__init__.py import_issue/etc/__init__.pyecho 'print("I am", __name__)' > import_issue/etc/test.pyecho 'from data_load.rand_data import RandData' >> import_issue/etc/test.pyecho 'print("Randdata = ", RandData)' >> import_issue/etc/test.pyecho "class RandData:" > import_issue/data_load/rand_data.pyecho '&nbsp; &nbsp; pass' >> import_issue/data_load/rand_data.py## now perform the testcd import_issuepython -m etc.test初始示例中的事情没有按预期工作的原因是,您提供的工作目录可能是etc ,如果您在 etc 中加载 python 脚本,那么它会尝试导入相对于当前工作目录 ( etc) 及以下的 load_dataetc没有名为 的目录rand_data,其中有一个文件__init__.py。我的修复建议是转到公共父目录(这现在将是您当前的工作目录)并将 etc/test 作为模块导入。原因是, test.py 位于带有init .py 的目录 etc 中,因此您应该将其作为 etc.test 导入,而不是直接调用它。不建议直接使用 etc/test.py 调用文件,即模块,并且会引起一些罕见的混乱情况。

翻过高山走不出你

etc而不是在目录&nbsp;中运行命令,而是在andpython test.py的父目录中运行 python 脚本。etcdata_load即您需要在终端中做的是(考虑到您仍在etc终端的目录中)1.&nbsp;&nbsp;&nbsp;&nbsp;`cd&nbsp;..` 2.&nbsp;&nbsp;&nbsp;&nbsp;`python&nbsp;etc/test.py`这会奏效。你为什么会遇到错误是因为在test.pypython 中正在寻找data_load模块的当前目录,并且由于目录中没有 data_load 模块,etc所以它给出了这个错误。如何解决上述问题在代码中附加 sys.path从包含所有包和 python 模块和脚本的项目主文件夹运行脚本。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python