如何在PyCharm项目中导入位于同一子目录中的Python文件

62

当我在Pycharm中进行调试和运行时,出现了输入错误。

我的项目结构已经正确根据etc./HW3/.设置,使得HW3成为根目录。

我在HW3中有一个子文件夹util和一个文件util/util.py。我还有另一个文件util/run_tests.pyutil中。

run_tests.py中,我有以下的导入结构:

from util.util import my_functions, etc.

这导致了一个输入错误:from util.util import load_dataset, proportionate_sample ImportError: No module named 'util.util'; 'util'不是一个包


然而,在同一项目的另一个目录(与util相同级别的目录)中,我有一个名为data/data_prep.py的文件,它也使用类似的import语句从util/util.py导入函数...并且可以正常运行。


显然,我在做作业时遇到了这个问题,请理解:这超出了作业范围。


当我把文件移动到另一个目录时,问题就解决了。所以我想问的问题是如何在PyCharm项目中导入位于同一目录中的Python文件? 因为如果我只使用import util,PyCharm会引发错误并提示我使用从根目录开始的完整名称。


4
你是否有一个 __init__.py 文件?如果没有,创建一个并添加 from util.util import my_function,然后尝试在文件中导入它。 - danidee
我应该将 __init__.py 放在基础目录中(即我的问题中的 HW3 目录),并在其中添加该行代码吗? - Chris
3
util文件夹中没有一个说明它是一个包的模块,__init__.py文件也可以用于导入/加载模块。 - danidee
好的,太棒了,我应该删除还是你想回答?谢谢,那真是非常有用的信息。到目前为止,这是一门关于Python的速成课程。 - Chris
希望能够得到一些练习机会 :) - danidee
8个回答

111

推荐方法:

确保将工作文件夹设置为Sources

您可以在Pycharm -> 首选项 -> 项目:XYZ -> 项目结构中进行操作。

选择您的工作文件夹并将其标记为Sources。然后,Pycharm会将该工作文件夹识别为该项目的源文件夹,您可以通过使用 add other files 简单地向其中添加其他文件。

import filename.py
或者
from filename.py import mudule1

=================

不推荐的方式:

Pycharm中,你可以简单地在从同一文件夹中导入的.py文件之前添加.。 在你的情况下,它将是:

from .util import my_functions

资源

这里还有一个很好的参考,它提供了更多信息和如何实现相对导入的示例。我强烈建议查看此页面。

相对导入


这解决了我的问题!我的文件夹源没有正确设置。 - alwaysaskingquestions
1
这也解决了我的问题。我可以运行我的代码,但在将其标记为“sources”之前,PyCharm会抱怨“找不到模块...” - Niklas Rosencrantz
啊,感觉好多了! - Chris F Carroll
这很好,直到你尝试从终端运行程序。此时所有的ModuleNotFoundErrors都会出现。 - HAL9000

23

右键点击您想要标记为源的文件夹 > 标记目录为 > 源根目录。


工作起来非常完美!谢谢! - Neverfaraway

22
如果您没有__init__.py文件,请创建一个,并添加此行。
from util.util import my_function

那么你可以轻松地在脚本中导入这个模块。 __init__.py 告诉 Python 将该文件夹作为一个 Python 包来处理,也可以用于导入/加载模块。

在大多数情况下,__init__.py 是空的。

引用文档

__init__.py 文件是必需的,以使 Python 将目录视为包含包;这是为了防止具有公共名称(例如 string)的目录无意中隐藏出现在模块搜索路径后面的有效模块。 在最简单的情况下,__init__.py 可以只是一个空文件,但它也可以执行包的初始化代码或设置稍后描述的 __all__ 变量。


2
在我的情况下,只有当我省略扩展名时它才奏效。例如:
import filename

1

注意:可能与主题有点无关。

我遇到了同样的问题,但当我在运行jupyter notebook时无法导入同一目录中的一个模块(而不是OP所要求的子目录)。奇怪的是,我已经设置了Python路径和解释器位置等等。其他答案都没有帮助,但是在Python中更改目录可以解决问题。

import os
os.chdir(/path/to/your/directory/)

我正在使用 PyCharm 2017.3Ubuntu 16.04 上。


1
我在使用 Pycharm 时也遇到了同样的问题,但实际错误是我尝试导入的文件没有 .py 扩展名,即使我可以将其作为独立脚本运行。查看资源管理器窗口,并确保它具有 .py 扩展名。如果没有,请右键单击资源管理器窗口中的文件,选择重命名,并将其重命名为 .py 扩展名。

0
在Pycharm中,转到“运行-配置”,取消选中“将内容根添加到Pythonpath”和“将源根添加到Pythonpath”,然后使用。
from filename import functionname

0
对我来说问题是,源目录标记正确,但我的要导入的文件以数字开头命名。通过重命名解决了这个问题。
import 01_MyModuleToImport

import MyModuleToImport

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接