Python在同一文件夹中找不到模块

181

我的Python无法在相同目录中找到任何模块。我做错了什么?(Python2.7)

因此,我有一个名为“2014_07_13_test”的目录,其中包含两个文件:

  1. test.py
  2. hello.py

其中hello.py文件内容为:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

def hello1():
    print 'HelloWorld!'

和 test.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

from hello import hello1

hello1()

依然给我带来 Python

>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 4, in <module>
ImportError: No module named hello

有什么问题吗?


3
你是如何执行脚本的?还有 import sys; sys.path 的输出是什么? - Salem
1
尝试输入 >>> import test - martineau
@Casy_fill 你是在文件所在的目录中运行程序吗?对于导入来说,导入和被导入的文件共享一个目录并不重要。重要的是,你的Python解释器已经正确设置了当前目录。 - Jan Vlcinsky
请仔细检查您是否从预期的根目录运行文件。 - carloswm85
16个回答

208

将您在test.py中的导入更改为:

from .hello import hello1

32
如果其他人之后看到了这条信息,这就是所谓的相对导入,它被添加在Python 2.5中: https://docs.python.org/2.5/whatsnew/pep-328.html。 - sgfit
27
要导入整个模块,请使用 from . import hello - ST7
27
对我来说这根本行不通。我不明白为什么Python导入总是这么难以理解的噩梦。 - Harry
18
这使我产生了"ImportError: attempted relative import with no known parent package"的错误。 - Cameron Chandler
我得到了与@CameronChandler相同的结果。我尝试将__init__.py添加到该文件夹中,然后将其删除,将其添加到PYTHONPATH中,然后将其删除,但都没有成功。 - Robert Rapplean
1
@CameronChandler 你是在主文件中做这个吗?相对导入在带有__main__的脚本中无法工作。 - Litchy

117

你的代码没问题,我怀疑问题出在你如何启动它上面。

你需要从你的“2014_07_13_test”目录中启动Python。

打开命令提示符并“cd”进入你的“2014_07_13_test”目录。

例如:

$ cd /path/to/2014_07_13_test
$ python test.py

如果您无法像这样进入目录,则可以将其添加到 sys.path 中。
在 test.py 中:
import sys, os
sys.path.append('/path/to/2014_07_13_test')

或者设置/编辑 PYTHONPATH

这样一切都应该没问题了...

...好吧,你的“shebang”行(两个文件的第一行)有一个小错误,'#'和'!'之间不应该有空格。

有一个更好的 shebang可以使用。

此外,你不需要在每个文件上添加 shebang 行... 只需要在你打算从 shell 运行的可执行文件上添加即可。


非常感谢,问题解决了!不幸的是,SublimeRepl(我使用的)目前不支持从文件夹启动Python,因此现在似乎需要导出PATH。 - Philipp_Kats
1
稍后的读者请阅读页面底部以查看其他非常有用的答案,例如 jfn 关于相对导入的答案。 - HongboZhu
是的,这就是我的问题。我在VS Code中打开了一个Python练习项目的大文件夹,并且在相同的目录下查找东西时遇到了大问题。我的问题是,在终端中,我没有更改目录到我当前项目所在的子目录。一旦我做到了,问题就解决了。 - Matt West
2
请注意,sys.path.append() 仅为当前 Python 会话添加位置,而非永久性添加。 - Amit Sharma

41

我遇到了类似的问题,解决方法是显式地将文件所在目录添加到路径列表中:

import os
import sys

file_dir = os.path.dirname(__file__)
sys.path.append(file_dir)

之后,我从同一个目录成功导入了内容,没有遇到任何问题。


5
虽然这样做有效,但是使用相对导入的 jwn 的答案是更加简洁的解决方案。 - Russ Schultz
它在我的那一边可以工作。谢谢。 - Leo N

38

这里是我使用的通用解决方案。它解决了从同一文件夹中的模块导入的问题:

import os.path
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

将以下内容放在出现“没有找到xxxx模块”的模块顶部:


1
这帮助我从父目录加载模块,通过将“..”替换为“../..”。非常感谢! - Nikola R.
1
__file__是要导入的文件的名称,或者我们正在导入模块的当前模块,或者它是常量。 - Manoj

14

在我的情况下,Python无法找到这个代码,因为我把它放在了一个带有连字符的模块中,例如my-module。当我将其更改为my_module时,它就能够正常工作了。


2

我曾经遇到过类似的问题。尽管所有模块都在同一个目录下,但我仍无法导入它们(ImportError)。我尝试了上面的解决方案,但它们都没有对我起作用。我不得不手动设置路径。此外,这段代码是在我的大学服务器上运行的,也许这就是为什么我不得不手动设置路径的原因。

import sys
sys.path.append(r'path_to_directory_where_all_modules_are')

我建议阅读模块搜索路径


这个运行得非常好!我正在使用Python 3.x。 - Imperial_J

2

我遇到了这个问题。在同一个目录下有三个文件夹,所以我必须指定哪个文件夹。 例如:从文件夹导入脚本:from Folder import script


1
花费数小时才让导入正常工作,例如:
from business import Business
from .business import Business
import .Business
import business.Business

最终我成功摆脱了嵌入式的Python安装,并通过像这样为所有用户安装 .exe 文件来重新安装了Python。
c:\Program Files\Python310

然后,我确保我的PATH变量与新安装的Python版本保持最新(所以我们想要看到或创建的条目类似于 c:\Program Files\Python310 和 c:\Program Files\Python310 \ Scripts 和%USERPROFILE%\AppData\Roaming\Python\Python310\Scripts ),并使用管理员权限启动了cmd,下载了get-pip.py文件,并在提升的cmd中运行它,如python get-pip.py,最终一切都按预期工作了...我不知道为什么或我做错了什么,但是Python似乎确实需要深度集成到Windows中,否则它就无法正常工作。这种情况并不经常发生,但在这种情况下,在Linux中它的表现要好得多;)

1
如果您确定所有要导入的模块和文件都在同一个文件夹中,并且只需通过名称而不是引用路径直接选择它们,那么您的编辑器或终端应该已经打开了包含所有文件/模块的主文件夹。
要么,尝试从终端运行,请确保首先进入正确的目录。
cd 根文件夹路径 python 脚本.py
要么,如果从编辑器(如VsCode)中运行[F5],则在那里打开完整的文件夹而不是单个文件。

在VSCode中打开完整文件夹对我很有帮助。谢谢! - Hassan Risvy

1
以下内容并不能解决原帖中的问题,但标题和错误与我所遇到的完全相同。
如果您的项目中有一个名为setup.py的脚本,您可以使用python3 -m pip install -e .python3 setup.py installpython3 setup.py develop安装该包,并且该包将被安装,但仍然是可编辑的(因此在导入包时会看到代码的更改)。如果没有setup.py理解它
无论如何,OP面临的问题似乎已经不存在了?
文件one.py:
def function():
    print("output")

文件 two.py:

#!/usr/bin/env python3

import one
one.function()

chmod +x two.py # To allow execution of the python file
./two.py # Only works if you have a python shebang

Command line output: output

其他解决方案看起来“不太优雅”

对于有两个测试文件的OP,修改它们以使其工作可能是可以的。然而,在其他真实场景中,其他答案中列出的方法可能不被推荐。它们要求您修改Python代码或限制您的灵活性(从特定目录运行Python文件)并一般引入烦恼。如果您刚刚克隆了一个项目,并且出现了这种情况怎么办?它可能已经为其他人工作了,进行代码更改是不必要的。所选答案还希望人们从特定文件夹运行脚本才能使其工作。这可能是长期烦恼的根源,这是不好的。它还建议将特定的Python文件夹添加到PATH(可以通过Python或命令行完成)。再次,如果您几个月后重命名或移动文件夹会发生什么?您必须再次寻找此页面,并最终发现需要设置路径(以及几个月前确实这样做了),并且只需更新路径即可(当然,您可以使用sys.path并以编程方式设置它,但这仍然可能不稳定)。许多讨厌的来源。


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