问题描述
考虑具有以下内容的以下目录结构:
my-project
├── main.py
├── lib
│ ├── __init__.py
│ ├── foo.py
│ └── bar.py
main.py
import sys
sys.path.append("./lib")
from foo import hello_world
if __name__ == "__main__":
hello_world()
foo.py
from lib.bar import name
def hello_world():
print(f"Hello {name}")
if __name__ == "__main__":
hello_world()
bar.py
name = "Grogu"
当我运行 main.py 时,我没有遇到任何错误并且得到了我期望的结果:Hello Grogu
。但是,当我运行 lib/foo.py 时,出现错误:
Traceback (most recent call last):
File "my-project/lib/foo.py",line 1,in <module>
from lib.bar import name
ModuleNotFoundError: No module named 'lib'
如果我将 lib.bar
更改为 bar
,它会按预期工作,但我不明白为什么 VSCode 似乎不知道 lib 文件夹是什么。
我正在使用 VSCode,但我认为我做错了什么。我使用 pyCharm 的朋友能够很好地运行 lib/foo.py。这可能是 VSCode 和 Pycharm 解释源代码的方式。有人有什么建议吗?
基本上,我试图从子目录导入函数并保留在子目录中运行单个文件的能力,但我似乎无法在 VScode 中找到执行此操作的正确方法。
解决方法
当您执行 Python 脚本时,脚本所在的特定目录会添加到路径中,但不会添加到其父目录中。
因此,当您从 lib 内部运行 import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
import mockRNCNetInfo from '@react-native-community/netinfo/jest/netinfo-mock.js';
jest.mock('@react-native-community/netinfo',() => mockRNCNetInfo);
Enzyme.configure({ adapter: new Adapter() });
时,路径将包含 python foo.py
但不包含 .../my-project/lib
,因此 Python 找不到模块 .../my-project
。但是,它适用于 lib
,因为该文件确实存在于 bar
中。
为了能够从根目录和 lib 运行,您可以将父目录(即根目录)插入/附加到 lib .../my-project/lib
中的路径:
__init__.py
然后,更改 main.py:
import sys
from pathlib import Path
sys.path.insert(0,str(Path(__file__).parent))
还有 foo.py:
from lib.foo import hello_world
if __name__ == "__main__":
hello_world()
,
直接导入bar
:
foo 和 bar 都是同级的模块,不需要返回 lib
,然后返回到搜索栏。我们可以直接运行from bar import name
。
更多详细信息请参考Python Docs - The import System