PyCharm错误:尝试导入自己的模块时(“ Python模块”)为“无模块”


159

我已经编写了一个模块(位于文件my_mod.py夹中的文件文件my_module)。目前,我正在处理文件cool_script.py夹中的文件cur_proj。我已经使用File-open在PyCharm中打开了该文件夹(我假设是一个PyCharm项目)。

在ProjectView(CMD-7)中,我可以看到我的项目cur_proj(红色),并且在“外部库”下可以看到my_module。在cool_script.py中,我可以写

from my_module import my_mod as mm

PyCharm甚至建议my_mod。到目前为止,一切都很好。

但是,当我尝试运行cool_script.py时,PyCharm告诉我 “没有名为my_module的模块”

我觉得这很奇怪,因为

A)在终端(OS 10.10.2)中,在python中,我可以导入模块没有问题-.bashrc中的PYTHONPATH中有相应的条目

B)在PyCharm中-设置-项目cur_proj-项目解释器-python解释器旁边的CogWheel-更多-显示所选解释器图标的路径,PYTHONPATH的路径确实出现(我认为应该如此)

因此,为什么在尝试运行cool_script.py时出现错误?- 我想念什么?

笔记:

附录2015年2月25日

当我进入PyCharm以运行-编辑配置时,对于当前项目,有两个选中的选项带有复选标记:“ 将内容根添加到PYTHONPATH ”和“ 将源根添加到PYTHONPATH ”。当我都取消选中时,我可以加载我的模块。

现在就可以了- 但是为什么呢?

出现了其他问题:

  • 什么是“内容根”和什么是“源根”?为什么在PYTHONPATH中添加一些内容却使其以某种方式中断?
  • 我是否应该一直取消选中这两个选项(在默认设置中也要取消选中这两个选项,而不是仅针对项目特定的配置(“运行/调试配置”对话框的左侧面板)?

2
您可能已经尝试过此方法,但是从其他软件包导入模块时,请包含packagename from foldername.mymodule import mymethod。我要做的另一件事是在用于获取模块的所有文件夹中添加空的_init .py文件夹,以便在from parentfolder.childfolder.mymodule ...需要将init放在两个文件夹中的情况下使用。根据文件夹相对于彼此的位置,您可能需要sys.path按照此答案中的说明
ziddarth 2015年

4
我也有你的问题 以下后解决了我的问题:stackoverflow.com/questions/21236824/...
user3155053

您是否确定了取消选中这些复选框的实际作用而不是选中它们的原因?
Nithish追求幸福

对我有用Enable Django Support的是取消选中Languages & Frameworks -> DjangoPro版本的PyCharm 中的设置。它正在打开一个导致导入问题的django控制台。
埃里克·布鲁姆

Answers:


323

如果您自己的模块在同一路径中,则需要将该路径标记为Sources Root。在项目浏览器中,右键单击要导入的目录。然后选择Mark Directory As,然后选择Sources Root

我希望这有帮助。


9
这对我有用,但是在将文件夹标记为源根目录之前,我还必须删除并重新创建以前创建的运行配置。
grinch

2
并需要添加__init__.py到使Python视该目录为一个包:stackoverflow.com/questions/448271/...
比阿特丽斯·丰塞卡

如果您不使用pycharm,该怎么办?我遇到了完全相同的问题。
Boudewijn Aasman '17

@BeatrizFonseca是的,我做到了。我无法使其升华,但我在这里安装了pycharm并尝试了答案,它工作得很好,因此它必须与指定正确的目录作为根包有关。
Boudewijn Aasman '17

@BoudewijnAasman,您可以尝试.在包名称之前使用以指定此包为本地包
Beatriz Fonseca

37

所以如果你去

->设置->项目:My_project->项目结构,

仅提供源代码所在的目录,并将其标记为“源”(您可以在同一窗口中看到它)。带有源代码的目录应变为蓝色。现在,您可以导入位于同一目录中的模块。


3
我意识到这是一篇旧文章,但对我有用。
迈克

1
多次遇到和忽略相同的答案,这次尝试了并且有效!
A.Ametov

29

PyCharm社区/专业版2018.2.1

我现在遇到了这个问题,并且能够以类似于@Beatriz Fonseca和@Julie指出的方式解决它。

如果转到File-> Settings-> Project: YourProjectName-> Project Structure,则将具有当前正在处理的项目的目录布局。必须浏览目录并将其标记Source为所有源文件的目录,或作为Resource严格导入文件的文件夹。

您还需要确保将__init__.py文件放置在资源目录中,或者实际上是要导入的任何位置,并且可以很好地工作。

我希望这个答案对某人有帮助,并希望JetBrains可以解决此烦人的错误。


2
这不是特定于PyCharm Professional的,而是PyCharm Community Edition 也提供此功能。在项目结构中,右键单击包含模块的目录,然后Mark Directory as从上下文菜单中选择,然后选择Sources Root
Astitva Srivastava

1
能否请您说明此来源根目录的含义。虽然它解决了我的问题,但我不太明白为什么要这么做。
user3341078

8

我尝试的是获取文件所在的位置。

例如 E:\git_projects\My_project\__init__.py is my location.

我转到文件->设置->项目:My_project->项目结构,然后将内容根添加到要提到的地方 E:\git_projects\My_project

它为我工作。


2
在“项目结构”中找到对我有用的文件夹。谢谢。
Microos '18

感谢@Virendra Patel和@Microos。我的pycharm项目在/home/my_user/git_projects/this_git_project/this_pycharm_project/。我添加/home/my_user/git_projects/this_git_project/了内容根目录和/home/my_user/git_projects/this_git_project/this_pycharm_project/唯一的源文件夹,一切终于完成了。
KLaz

3

my_module是不是模块的文件夹,您不能导入文件夹,请尝试移至my_mod.py与相同的文件夹cool_script.py,然后执行import my_mod as mm。这是因为python仅在当前目录和中sys.path查找,因此my_mod.py除非在同一目录中,否则不会找到

或者,您可以在此处找到答案,告诉您如何从其他目录导入。

关于您的其他问题,我不知道我不使用PyCharm。


您可以在文件夹中创建init .py,python解释器将读取为python包:mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html
Beatriz Fonseca

3

我也收到“将源根添加到PYTHONPATH”错误。我的问题是我有两个具有相同名称的文件夹,例如project/subproject1/thing/src和,project/subproject2/thing/src并且两个文件夹都标记为源根。当我将其中一个"thing"文件夹重命名为"thing1"(任何唯一的名称)时,它起作用了。

也许PyCharm自动添加选定的源根目录,它不会使用完整路径,因此会混淆具有相同名称的文件夹。


2

当Python解释器找不到您的代码时,可能会导致这种情况。您必须向Python明确提及才能在此位置找到您的代码。

为此:

  • 转到您的python控制台
  • 添加sys.path.extend(['your module location'])到Python控制台。

在您的情况下:

  • 转到您的python控制台,
  • 首先,编写以下代码:

    import sys
    sys.path.extend([my module URI location])
  • 编写此语句后,可以运行以下命令:

    from mymodule import functions

添加这样的路径有点难看,但对我有用。
Florian Blume '18

这应该由pycharm完成,在打开控制台时,他应该自动为包含依赖项(其他项目)的目录以及包含本项目源代码的目录包括sys.path.extend命令。但是它不会自动执行
fabiob

2

必须完成的关键混乱步骤是为您要执行的源文件重新创建运行配置,以便IDE选择新路径。

对我而言,真正有效的方法是转到“运行/编辑配置...”,为您要在左侧运行的文件选择配置,取消选中“将源根添加到PYTHONPATH”框,保存,然后返回并选中该框并保存。然后它会工作。


令人惊讶的是,尽管做了Invalidate Cache/Restart两次,这仍然是我所需要的!
乔什·弗里德兰德

1

内容根是保存项目代码的文件夹,而源根也被定义为相同的文件夹。我唯一了解的区别是,源根目录中的代码是在内容根目录中的代码之前构建的。

取消选中它们不会影响运行时,直到您没有在程序包中创建单独的模块(这些模块已手动连接到Django)为止。这意味着,如果您的任何文件不包含“ from django import ...”或未通过django调用任何功能,则取消选中这两个选项将导致故障。

更新-仅在使用Virtual Environmanet时出现问题,并且仅在通过提供的终端控制项目时出现。因为终端仍然可以通过默认系统pyhtonpath而不是虚拟环境工作。而python django控制面板可以正常工作。


1

解决此问题而不必将目录标记为源根的解决方案是编辑运行配置,然后在执行中选择选项“重定向输入自”,然后选择要运行的脚本。之所以可行,是因为随后将其视为脚本是在此目录中以交互方式运行。但是,Python仍会使用错误“没有名为x的模块”来标记模块名称:

从以下位置重定向输入:

解释器执行import语句时,它将在从以下来源汇编的目录列表中搜索x.py:

  1. 运行输入脚本的目录或当前目录(如果解释器正在交互运行)
  2. PYTHONPATH环境变量(如果已设置)中包含的目录列表。
  3. 在安装Python时配置的与安装有关的目录列表,在我的情况下为Ubuntu上的usr / lib / python3.6。

0

Pycharm 2017.1.1

  1. 点击View->ToolBarView->Tool Buttons
  2. 在左窗格Project上将可见,右键单击它,然后按Autoscroll to source ,然后运行您的代码。

这对我有用。


0

ln -s someProject

如果您有someDirectory / someProjectDir和两个文件,则file1.py和file2.py,以及file1.py尝试使用此行导入

从someProjectDir导入file2

即使您已将someProjectDir指定为源目录,并且即使它在首选项中也将项目,项目结构菜单显示为内容根目录,它也无法使用。它将起作用的唯一方法是通过链接如上所示的项目(unix命令,在Mac中工作,不确定Windows的使用或语法)。由于软链接是由Pycharm在依赖项目中创建的,因此似乎存在某种机制,Pycharm可以在从版本控制签出或作为上下文根添加时自动执行此操作。因此,尽管复制了相同的内容,但奇怪的是目录的复制令人烦恼,而必要性却令人困惑。同样在自动创建的依赖项中,它在版本控制下也不显示为新目录。.idea文件的比较可能会发现更多。


-1

对我有用的答案确实是OP在他的2015年更新中提到的内容:取消选中Python运行配置中的以下两个框

  • “将内容根添加到PYTHONPATH”
  • “将源根添加到PYTHONPATH”

我已经将run config设置为使用正确的venv,因此PyCharm不需要做其他工作即可向路径添加内容。相反,它导致了错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.