从另一个目录导入的Python失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从另一个目录导入的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'
答案

更改到etc和data_load的父目录并键入

python -m etc.test

这应该完成工作。

这里有一个小的测试用例(假设您在Linux机器上)

## create the test case
mkdir -p import_issue/data_load import_issue/etc
touch import_issue/data_load/__init__.py import_issue/etc/__init__.py
echo 'print("I am", __name__)' > import_issue/etc/test.py
echo 'from data_load.rand_data import RandData' >> import_issue/etc/test.py
echo 'print("Randdata = ", RandData)' >> import_issue/etc/test.py
echo "class RandData:" > import_issue/data_load/rand_data.py
echo '    pass' >> import_issue/data_load/rand_data.py
#
# now perform the test
cd import_issue
python -m etc.test

最初的示例中的内容未按预期进行的原因是,您当前的工作目录可能为etc并且如果您在等中加载python脚本,则它将尝试导入相对于当前工作目录(etc)的load_data,在etc以下没有名为rand_data的目录,其中包含文件__init__.py

我的修复建议是转到公共父目录(现在将成为您当前的工作目录),并将etc / test作为模块导入。原因是,test.py位于具有init。py的目录等中,因此您应将其导入为etc.test而不是直接调用它。确实不建议直接使用etc / test.py调用文件(即模块),这可能会引起一些罕见的混乱情况。

另一答案

代替etc目录中的运行命令python test.pyetcdata_load的父目录中运行python脚本。

即,您需要在终端中执行的操作(考虑到您仍在终端的etc目录中]

1.    `cd ..`
2.    `python etc/test.py`

这将起作用。

您为什么遇到错误是因为在test.py中python在data_load模块的当前目录中查找,并且由于etc目录中没有data_load模块,因此出现此错误。

如何解决上述问题

  1. 在代码中附加sys.path
  2. 从项目主文件夹运行脚本,该文件夹包含所有软件包,python模块和脚本。

以上是关于从另一个目录导入的Python失败的主要内容,如果未能解决你的问题,请参考以下文章

将Python导入函数从另一个目录导入文件,然后从另一个目录导入另一个函数

如何从另一个目录导入 python 包?

使用 Python 3 从另一个目录中的模块导入本地函数,并在 Jupyter Notebook 中进行相对导入

从另一个片段中的目录更新片段中的列表视图元素

如何将 python 函数从另一个文件导入 django 视图

如何以透明的方式从另一个 git 分支获取目录的副本?