为啥从命令行运行时导入失败,而从 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 importexport 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?