Python无法从另一个目录导入

时间:2019-10-04 21:35:42

标签: python python-3.x python-3.6

我读到要使用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'

2 个答案:

答案 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中运行命令,而是在etcdata_load的父目录中运行python脚本。

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

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

这将起作用。

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

如何解决以上问题

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