为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MYYA 2022-06-14 14:56:17
我读到要使用python文件作为导入模块,我需要放在__init__.py目录中。我有以下目录结构:data_load    -- __init__.py    -- rand_data.pyetc     -- __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 RandDataModuleNotFoundError: No module named 'data_load'
查看完整描述

2 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

切换到 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 ,如果您在 etc 中加载 python 脚本,那么它会尝试导入相对于当前工作目录 ( etc) 及以下的 load_dataetc没有名为 的目录rand_data,其中有一个文件__init__.py。


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


查看完整回答
反对 回复 2022-06-14
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

etc而不是在目录 中运行命令,而是在andpython test.py的父目录中运行 python 脚本。etcdata_load

即您需要在终端中做的是(考虑到您仍在etc终端的目录中)

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

这会奏效。

你为什么会遇到错误是因为在test.pypython 中正在寻找data_load模块的当前目录,并且由于目录中没有 data_load 模块,etc所以它给出了这个错误。

如何解决上述问题

  1. 在代码中附加 sys.path

  2. 从包含所有包和 python 模块和脚本的项目主文件夹运行脚本。


查看完整回答
反对 回复 2022-06-14
  • 2 回答
  • 0 关注
  • 231 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信