为什么当从命令行 运行 时我的导入失败,而如果 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

您也可以使用相对导入。有点难,可读性差且容易出错的方式需要对项目结构进行一些工作。