Python 为什么从命令行运行时导入失败,而从PyCharm运行时导入成功?
我得到“ModuleNotFoundError:没有名为的模块” 一点背景: 1) 我的venv使用的是python 3.6.9 2) 已尝试通过sys.path.append将文件夹添加到PYTHONPATH 3) 继承权或相关部分: /项目文件夹 |--文件夹A |--文件夹B |--init.py 我正在尝试从a.py导入到b.py 以各种方式尝试过- 1) 进口b 2) 从b导入x 非常感谢您的帮助,我们在这方面已经有一段时间了。Python 为什么从命令行运行时导入失败,而从PyCharm运行时导入成功?,python,python-3.6,python-import,python-3.7,Python,Python 3.6,Python Import,Python 3.7,我得到“ModuleNotFoundError:没有名为的模块” 一点背景: 1) 我的venv使用的是python 3.6.9 2) 已尝试通过sys.path.append将文件夹添加到PYTHONPATH 3) 继承权或相关部分: /项目文件夹 |--文件夹A |--文件夹B |--init.py 我正在尝试从a.py导入到b.py 以各种方式尝试过- 1) 进口b 2) 从b导入x 非常感谢您的帮助,我们在这方面已经有一段时间了。为什么? 因为您运行脚本的方式不同。使用PyCharm运行
为什么?
因为您运行脚本的方式不同。使用PyCharm运行时,PyCharm会将项目目录和所有源目录添加到sys.path
。这就是为什么导入A.A
有效的原因。但是,当您使用console命令运行脚本时,只有文件位置被添加到sys.path
。只需打印sys.path
即可查看它包含的内容
要解决这个问题,您可以使用各种方法
最简单的方法是使用PYTHONPATH
。例如,在Windows上,您可以运行命令set PYTHONPATH=[project_folder];%PYTHONPATH%
然后导入A.A工作。或者您可以运行稍微不同的版本set PYTHONPATH=[project_folder/A];%PYTHONPATH%
然后导入一个工作。基本上,这个命令将目录添加到sys.path
另一种解决方案是在b.py
中设置main
功能,在project\u文件夹中设置一些启动脚本.py
。您不运行b.py
而是运行启动脚本.py
。因此,项目目录始终位于sys.path
中。因此,从项目目录开始的绝对导入(如import A.A
)将在PyCharm和console中工作
另一种方法是一些丑陋的代码,如下所示:
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
也可以使用相对导入。这是一种更加困难、可读性较差且容易出错的方法,需要对项目结构进行一些工作。当您希望通过命令行运行文件夹B时,应指定文件夹B。如果你从pycharm作为project打开它,它会找到你的导入,因为文件夹B和A在同一个项目中。我在导入中指定了它-“从B导入。方法。这就是你的意思吗?不,例如,如果你的主项目名为包含文件夹A和B的AB,你应该像“从AB.B.B导入”一样从AB导入“我尝试了插入”。。。“import B PyCharm将其标记为红色作为错误通过控制台添加PYTHONPATH(例如linuxexport PYTHONPATH=your_path_to_project
)。在运行py脚本之前,请执行此操作。谢谢输入。虽然-我已经尝试过通过sys.path插入PYTHONPATH,或者使用export PYTHONPATH=对其进行硬编码。。。(linux),我尝试过相对导入,但没有。我不知道为什么会这样。这些都不管用。我的main在导入到的文件中。好的。。。唯一有效的是你的“丑陋代码”建议。。。谢谢你@TomerInbar我尝试了所有3种方法(除了相对导入)-所有这些都是为我的虚拟测试项目(py3.7,win10)工作的。基本上,它们都是以稍微不同的方式将project\u目录添加到sys.path
。因此,所有3种解决方案都应该有效。我建议检查打印(sys.path)
的问题。查看实际内容-project\u目录
应该与script\u目录
一起存在。祝你好运。
|--__init__.py
|--b.py
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