[英]VSCode ModuleNotFoundError: No module named X
我正在尝试构建一个新的 package,但是,当我尝试从 VSCode 内部或终端运行任何文件时,我遇到了这个错误:
ModuleNotFoundError: No module name 'x'
我当前的文件夹结构如下:
package
|---module
|------__init__.py
|------calculations.py
|------miscfuncs.py
|---tests
|------__init__.py
|------test_calcs.py
|---setup.py
|---requirements.txt
但是,当我通过 VSCode 运行我的测试(PyTest)并使用import module.calculations as calc
或from module.calculations import Class
in test_calcs.py 时,测试按预期工作 - 这让我感到困惑。
我知道这是一个常见问题,但我无法想出一个可以在这里工作的解决方案。
我尝试使用下面的代码检查工作目录是否在系统路径中。 返回的目录列表中的第一项是我正在使用的目录。
import sys
print(sys.path)
我还在文件中使用了以下内容,但无济于事:
import module.calculations
import .module.calculations
from . import miscfuncs
尝试import.module.calculations
时,我得到以下信息:
ModuleNotFoundError: No module named '__main__.module'; '__main__' is not a package
当尝试from. import miscfuncs
在calculation.py中from. import miscfuncs
,我得到以下错误:
ImportError: cannot import name 'miscfuncs'
在处理模块文件夹中的文件时,我可以使用相对导入: import calculations
,它工作正常。 这对于模块内的文件很好,但当我在 test_calcs.py 中工作时则不行。
在我的 setup.py 中,我有一行:
packages=['module']
如果需要,很高兴发布更多信息或链接到我的存储库以获取完整代码。
编辑
遵循remram的解决方案:
我已经更新launch.json
以包含CWD
和PYTHONPATH
变量。
模块名称仍然无法识别,但是 VSCode 中的 IntelliSense 可以很好地提取导入文件中的函数。
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"cwd": "${workspaceFolder}",
"env": {"PYTHONPATH": "${cwd}"
}
}
]
如果您希望import module.calculations
起作用,请确保您从package
文件夹(而不是从package/module
)运行。 您还可以将PYTHONPATH
环境变量设置为package
文件夹的路径。
根据你的描述,我没有得到足够的信息,但我想我可以推测有两个关键点你没有意识到。
相对导入只能在 package(或模块)内部使用。
参考python官方文档模块
请注意,相对导入基于当前模块的名称。 由于主模块的名称始终为
__main__
,因此用作 Python 应用程序的主模块的模块必须始终使用绝对导入。
即使calculations.py
在package中,但你将它作为“主模块”运行,它也不起作用。
绝对导入的模块(您自己的)应位于您current work directory
下(在sys.path
或 env PYTHONPATH
中的路径下)
对于它在测试中运行良好的问题,我认为这取决于你的“主模块”工作的目录,你应该仔细检查。
你只需要解决这两点,你就会解决你的问题。
对我有用的是使用pyproject.toml
文件:
[tool.pytest.ini_options]
pythonpath = [
"."
]
@lepidopterist 评论被证明是数小时挣扎的游戏规则改变者......
"terminal.integrated.env.windows": { "PYTHONPATH": "${workspaceFolder}" }
供参考: Settings.json
这是我的项目结构......项目
我的项目中有三个模块/包!
我想做的事!
什么没有奏效!
from..convenience.utilities import add
给...
beyond top level package error
from convenience.utilities import add
给...
ModuleNotFoundError: No module named 'convenience'
"env": {"PYTHONPATH": "${workspaceFolder}"}
给...
ModuleNotFoundError: No module named 'convenience'
为什么解决方案(我在开始时提到?)有效?
(需要注意的一件事):我的操作系统是 windows 所以它是......
"terminal.integrated.env.windows"
对于 Linux 它将是......
"terminal.integrated.env.linux"
为了调试 main.py VSCode 需要知道明确的库路径。 这可以通过在 launch.json 中设置环境 ('env') 变量来完成。 第一步是在 .vscode 文件夹中创建一个“launch.json”。
/
├── .vscode/
│ └── launch.json
├── mySubdir/
│ └── myLib.py
└── main.py
如果 main.py 想要将 myLib.py 作为模块导入,VSCode 只有在 mySubDir 是 Python 路径的一部分时才能这样做。
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"cwd": "${fileDirname}",
"env": {"PYTHONPATH": "${workspaceFolder}/mySubdir${pathSeparator}${env:PYTHONPATH}"},
}
]
}
{workspaceFolder}和{pathSeparator}是预定义的变量,将被 VSCode 替换。
该线程给出了更广泛的解释: How to correct set PYTHONPATH for Visual Studio Code
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.