【问题标题】:Import Sibling Packages with __init__.py doesn't work使用 __init__.py 导入兄弟包不起作用
【发布时间】:2020-10-23 03:21:03
【问题描述】:

我正在尝试一个结构如下的项目:

root_folder
├── __init__.py
├── a_folder
│   ├── __init__.py
│   └── script_1.py
├── b_folder
│   ├── __init__.py
│   └── script_2.py
└── script_3.py

我在 root_folder 上打开 IDE(VS Code)。我将空的__init__.py 文件添加到子文件夹和root_folder。我也保存所有并重新启动 IDE。

但是,当我尝试在script_2 中导入script_1 时,出现错误:

# in script_2.py

from a_folder import script_1

ModuleNotFoundError: No module named 'script_1'

我也尝试了很多其他的方法,比如

# in script_2.py

from root_folder.a_folder import script_1

# Or

from .a_folder import script_1

但它们仍然不起作用。我到处搜索,但仍然无法解决。你能不能给我一些提示?谢谢!

更新

以下是路径的一些打印结果:

# when I try to run script_2 in b_folder

print(os.path.abspath(''))
print(os.getcwd())

---/home/nick/Desktop/root_folder
---/home/nick/Desktop/root_folder


print(sys.path)

---
['/home/nick/Desktop/root_folder/b_folder', '/home/nick/anaconda3/envs/pytorch101/lib/python37.zip', '/home/nick/anaconda3/envs/pytorch101/lib/python3.7', '/home/nick/anaconda3/envs/pytorch101/lib/python3.7/lib-dynload', '/home/nick/anaconda3/envs/pytorch101/lib/python3.7/site-packages']

【问题讨论】:

  • __init__.py 将文件夹定义为模块。 import script_1 from a_folder
  • 我怀疑你在打这个:stackoverflow.com/a/45448394/812183 但我没有足够的信心将 VTC 视为重复
  • 嗨,我认为这不是重复的,原因有两个:首先,我正在尝试运行同级脚本,但不是父脚本。就像我尝试运行 script_3.py 一样,那么您的链接就是答案。其次是……相对路径和绝对路径在这里都不起作用……但是还是非常感谢您的帮助!

标签: python visual-studio visual-studio-code


【解决方案1】:

在import语句前,添加如下代码

import sys
sys.path.append("./")

将当前路径添加到工作区,然后就可以成功导入模块了。

这是我的项目截图,与你的文件夹结构相同。

[编辑]

我假设你的 cwd(当前工作目录)在 root_folder 下,就像我的一样。那么 sys.path.append("./") 应该可以工作了。

现在转到root_Project,在launch.json中添加如下代码:

"env": {
    "PYTHONPATH": "${workspaceFolder}",
},
"cwd": "${workspaceFolder}"

Python扩展会搜索root_project下的模块,可以直接导入模块:

更多详细信息请参考env in debugVariables

【讨论】:

  • 嗨,莫莉!非常感谢你的回复。我试过你的方法,但它不起作用。然后我根据你的建议做了修改:我使用sys.path.append("./root_folder")。现在可以了!
  • 其实我不知道为什么会这样,好像././root_folder,他们是一回事,对吧?你有什么建议吗?谢谢。
  • 我认为您当前的工作目录不是终端中显示的 \xxxx\root_folder。这就是为什么 python 扩展无法实现它的原因。建议转到当前项目文件夹,我会用第二个选项编辑我的答案,请看一下。
  • 谢谢莫莉!现在相对路径有效!我可以再问一个问题吗?看来我们只需要在这里使用sys.append('./'),对吧?因为在删除__init__.py 之后,它仍然可以与sys.append 完美导入。似乎__init__.py 无法在 VS Code 中将文件夹正确传输到模块中。
  • 我还更新了问题正文中的路径 env。请随时检查。谢谢!
【解决方案2】:

如果您仍在使用 Jetbrains Pycharm 等 IDE,请将您的文件夹“root_folder”设置为“源根”。如果你使用VSC,同样的操作你可以做同样的事情。 另一方面:

import sys
sys.path.append('your path')

可以手动将包添加到系统级别的ENV Path中。

祝你好运。

【讨论】:

  • 有效!谢谢文蒂!请问:__init__.py这里好像不能正常将文件夹转入模块,所以我们跳过sys.append这一步吧?因为在我删除了所有__init__.py 之后,它仍然可以通过 sys.append 完美导入。你有什么建议吗?谢谢!
  • 我还更新了问题正文中的路径 env。请随时检查。谢谢!
猜你喜欢
  • 2016-04-09
  • 2021-10-05
  • 2013-04-21
  • 1970-01-01
相关资源
最近更新 更多