从另一个目录导入的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.py
在etc
和data_load
的父目录中运行python脚本。
即,您需要在终端中执行的操作(考虑到您仍在终端的etc
目录中]
1. `cd ..`
2. `python etc/test.py`
这将起作用。
您为什么遇到错误是因为在test.py
中python在data_load
模块的当前目录中查找,并且由于etc
目录中没有data_load模块,因此出现此错误。
如何解决上述问题
- 在代码中附加sys.path
- 从项目主文件夹运行脚本,该文件夹包含所有软件包,python模块和脚本。
以上是关于从另一个目录导入的Python失败的主要内容,如果未能解决你的问题,请参考以下文章
将Python导入函数从另一个目录导入文件,然后从另一个目录导入另一个函数
使用 Python 3 从另一个目录中的模块导入本地函数,并在 Jupyter Notebook 中进行相对导入