为啥从命令行运行时导入失败,而从 PyCharm 运行导入成功?

Posted

技术标签:

【中文标题】为啥从命令行运行时导入失败,而从 PyCharm 运行导入成功?【英文标题】:Why are my imports failing when running from command line while imports succeed if running from PyCharm?为什么从命令行运行时导入失败,而从 PyCharm 运行导入成功? 【发布时间】:2020-05-14 19:30:48 【问题描述】:

我得到“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

非常感谢一些帮助,已经有一段时间了。

【问题讨论】:

当你想通过命令行运行它时,你应该在你想导入b时指定文件夹B。如果您从 pycharm 作为项目打开它,它会找到您的导入,因为文件夹 B 和 A 在同一个项目中。 我确实在导入中指定了它-“from b import .method。这是你的意思吗? 否,例如,如果您的主项目名称是 AB 包含文件夹 A 和 B,您应该像“从 AB.B.b import ”一样导入 我试过 intering "from AB..." import B PyCharm 用红色标记为错误 通过控制台添加 PYTHONPATH(例如 linux export PYTHONPATH=your_path_to_project)。在运行 py 脚本之前执行此操作 【参考方案1】:

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

您也可以使用相对导入。需要在项目结构上进行一些工作的更难、可读性更低且容易出错的方式。

【讨论】:

感谢您的投入。虽然-我已经尝试通过 sys.path 插入 PYTHONPATH 或使用 export PYTHONPATH=... (linux) 对其进行硬编码,但我已经尝试过相对导入,但又没有。我不知道为什么会这样。这些都不起作用。我的主要内容在我要导入的文件中。 好的...唯一有效的是您的“丑陋代码”建议...谢谢! @TomerInbar 我尝试了所有 3 种方法(相对导入除外) - 都适用于我的虚拟测试项目(py3.7,win10)。基本上它们都是关于以稍微不同的方式将project_directory 添加到sys.path。因此,所有 3 种解决方案都应该有效。我建议使用print(sys.path) 检查问题。查看实际内容 - project_directory 应该与 script_directory 一起出现。祝你好运。

以上是关于为啥从命令行运行时导入失败,而从 PyCharm 运行导入成功?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 ssh 从 crontab 失败但从命令行执行时成功?

为啥使用Mysql命令source导入.sql文件时总是出错?

为啥 PyCharm 不导入/检测从源代码编译和安装的 OpenCV?

为啥从 powershell 命令行连接到 github 时出错?

Pygame模块在Pycharm导入失败解决

解决:python命令行运行出错 ImportError: No module named ...