我读到要使用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'
答案 0 :(得分:1)
更改到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调用文件(即模块),这会引起一些罕见的混乱情况。
答案 1 :(得分:0)
而不是在etc
目录python test.py
中运行命令,而是在etc
和data_load
的父目录中运行python脚本。
即您需要在终端中执行的操作(考虑到您仍位于终端的etc
目录中)
1. `cd ..`
2. `python etc/test.py`
这将起作用。
您为什么要遇到错误,是因为python在test.py
的当前目录中查找data_load
模块,并且由于etc
目录中没有data_load模块,因此出现此错误
如何解决以上问题