Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么从命令行运行时导入失败,而从PyCharm运行时导入成功?_Python_Python 3.6_Python Import_Python 3.7 - Fatal编程技术网

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

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运行

我得到“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会将项目目录和所有源目录添加到
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(例如linux
export 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