为什么当从命令行 运行 时我的导入失败,而如果 PyCharm 的 运行 则导入成功?
Why are my imports failing when running from command line while imports succeed if running from PyCharm?
我得到 "ModuleNotFoundError: No module named "
一点背景知识:
1) 我的 venv 使用的是 python 3.6.9
2) 已经尝试通过 sys.path.append
将文件夹添加到 PYTHONPATH
3) 层次结构,或相关部分:
/项目文件夹
|--文件夹A
|--__init__.py
|--a.py
|--文件夹B
|--__init__.py
|--b.py
|--init.py
我正在尝试从 a.py 导入到 b.py
以各种方式尝试过-
1) 导入 b
2) 从 b 导入 x
真的很感激一些帮助,现在已经有一段时间了。
Why?
因为您 运行 您的脚本不同。当您使用 PyCharm 运行 时,PyCharm 将项目目录和所有源目录添加到 sys.path
。这就是 import A.a
起作用的原因。但是,当您使用控制台命令 运行 脚本时,只会将文件位置添加到 sys.path
。只需打印 sys.path
即可查看其中包含的内容。
要解决这个问题,您可以使用各种方法。
最简单的方法是使用 PYTHONPATH
。例如,在 Windows 上,您可以 运行 命令 set PYTHONPATH=[project_folder];%PYTHONPATH%
然后 import A.a
起作用。或者你可以 运行 稍微不同的版本 set PYTHONPATH=[project_folder/A];%PYTHONPATH%
然后 import a
工作。基本上这个命令将目录添加到 sys.path
.
另一种解决方案是在 b.py
中使用 main
功能,在 project_folder
中使用一些 launching_script.py
功能。而不是 运行宁 b.py
你 运行 你的 launching_script.py
。因此,您始终在 sys.path
中拥有项目目录。因此,以项目目录(如 import A.a
)开头的绝对导入将在 PyCharm 和控制台中都有效。
另一种方法是一些丑陋的代码,如下所示:
try:
import A.a as module_a
except ModuleNotFoundError:
import pathlib
import sys
sys.path.append(str(pathlib.Path(__file__).parent.parent))
import A.a as module_a
您也可以使用相对导入。有点难,可读性差且容易出错的方式需要对项目结构进行一些工作。
我得到 "ModuleNotFoundError: No module named "
一点背景知识:
1) 我的 venv 使用的是 python 3.6.9
2) 已经尝试通过 sys.path.append
将文件夹添加到 PYTHONPATH3) 层次结构,或相关部分:
/项目文件夹
|--文件夹A
|--__init__.py
|--a.py
|--文件夹B
|--__init__.py
|--b.py
|--init.py
我正在尝试从 a.py 导入到 b.py 以各种方式尝试过-
1) 导入 b
2) 从 b 导入 x
真的很感激一些帮助,现在已经有一段时间了。
Why?
因为您 运行 您的脚本不同。当您使用 PyCharm 运行 时,PyCharm 将项目目录和所有源目录添加到 sys.path
。这就是 import A.a
起作用的原因。但是,当您使用控制台命令 运行 脚本时,只会将文件位置添加到 sys.path
。只需打印 sys.path
即可查看其中包含的内容。
要解决这个问题,您可以使用各种方法。
最简单的方法是使用 PYTHONPATH
。例如,在 Windows 上,您可以 运行 命令 set PYTHONPATH=[project_folder];%PYTHONPATH%
然后 import A.a
起作用。或者你可以 运行 稍微不同的版本 set PYTHONPATH=[project_folder/A];%PYTHONPATH%
然后 import a
工作。基本上这个命令将目录添加到 sys.path
.
另一种解决方案是在 b.py
中使用 main
功能,在 project_folder
中使用一些 launching_script.py
功能。而不是 运行宁 b.py
你 运行 你的 launching_script.py
。因此,您始终在 sys.path
中拥有项目目录。因此,以项目目录(如 import A.a
)开头的绝对导入将在 PyCharm 和控制台中都有效。
另一种方法是一些丑陋的代码,如下所示:
try:
import A.a as module_a
except ModuleNotFoundError:
import pathlib
import sys
sys.path.append(str(pathlib.Path(__file__).parent.parent))
import A.a as module_a
您也可以使用相对导入。有点难,可读性差且容易出错的方式需要对项目结构进行一些工作。