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

Posted

技术标签:

【中文标题】Python 在同一文件夹中找不到模块【英文标题】:Python can't find module in the same folder 【发布时间】:2014-09-03 12:34:49 【问题描述】:

我的 python 在同一目录中找不到任何模块。 我究竟做错了什么? (python2.7)

所以我有一个目录'2014_07_13_test',里面有两个文件:

    test.py 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

怎么了?

【问题讨论】:

你是如何执行脚本的?还有import sys; sys.path的输出是什么@ 试试&gt;&gt;&gt; import test @Casy_fill 您是否从目录运行程序,文件在哪里?对于导入,导入和导入的文件共享一个目录并不重要。重要的是,您的 Python 解释器已正确设置当前目录。 仔细检查您正在运行预期根目录中的文件。 【参考方案1】:

你的代码很好,我怀疑你的问题是你如何启动它。

您需要从“2014_07_13_test”目录启动 python。

打开命令提示符并“cd”到“2014_07_13_test”目录。

例如:

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

如果你不能像这样'cd'进入目录,你可以将它添加到sys.path

在 test.py 中:

import sys, os
sys.path.append('/path/to/2014_07_13_test')

或设置/编辑PYTHONPATH

一切都会好起来的……

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

您应该使用better shebang。

此外,您不需要在每个文件上都使用 shebang 行...只需要您打算从 shell 作为可执行文件运行的那些。

【讨论】:

非常感谢,这个问题!不幸的是,SublimeRepl(我使用的)现在不支持从文件夹启动 python,所以我现在需要导出 PATH 以后的读者请阅读到页面底部以查看其他非常有用的答案,例如jfn 关于relative imports的那个。 是的,这是我的问题。我在 VS Code 中打开了一个包含 Python 练习项目的大文件夹,但在同一目录中查找内容时遇到了很大的问题。我的问题是,在终端中,我没有将目录更改为我当前项目所在的子目录。一旦我这样做了,问题就解决了。 请注意 sys.path.append() 仅添加当前 python 会话的位置,而不是永久添加。【参考方案2】:

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

from .hello import hello1

【讨论】:

如果其他人后来发现了这个,这称为相对导入,是在 python 2.5 中添加的:docs.python.org/2.5/whatsnew/pep-328.html 导入整个模块使用from . import hello 我认为这是一个比公认的最佳答案更好的解决方案。正如 ST7 指出的那样,我使用整个模块导入:from . import local_module【参考方案3】:

我有一个类似的问题,我通过将文件的目录显式添加到路径列表来解决它:

import os
import sys

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

之后,我从同一个目录导入就没有问题了。

【讨论】:

虽然这行得通,但 jwn 使用相对导入的答案是一个更清洁的解决方案。【参考方案4】:

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

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

把它放在给出错误“No module named xxxx”的模块顶部

【讨论】:

这帮助我从父目录加载模块,将“..”替换为“../..”。非常感谢! file 要导入的文件的名称或我们正在导入模块的当前模块的名称,或者它是常量【参考方案5】:

就我而言,Python 无法找到它,因为我将代码放在带有连字符的模块中,例如my-module。当我将其更改为 my_module 时,它起作用了。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

以下并没有解决OP的问题,但标题和错误正是我所面临的。

如果您的项目中有一个setup.py 脚本,您可以安装您所在的包,使用python3 -m pip install -e .python3 setup.py installpython3 setup.py develop,该包将被安装,但仍可编辑(因此更改导入包时会看到代码)。如果它没有setup.py,make sense of it。

无论如何,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

其他解决方案看起来很“脏”

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

【讨论】:

【参考方案8】:

如果您确定您尝试导入的所有模块、文件都在同一个文件夹中,并且应该直接通过提供名称而不是引用路径来选择它们,那么您的编辑器或终端应该已经打开了主目录所有文件/模块都存在的文件夹。

或者,尝试从终端运行,确保首先进入正确的目录。

cd path to the root folder where all the modules are

python script.py

或者,如果从编辑器(即 VsCode)运行 [F5],则在此处打开完整文件夹,而不是单个文件。

【讨论】:

【参考方案9】:

我有一些类似的问题。即使它们都在同一个目录中,我也无法导入模块(importError)。我尝试了上面的解决方案,但没有一个对我有用。我必须自己(手动)设置路径。另外,代码是在我的大学服务器上运行的,也许这就是我必须手动设置路径的原因。

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

我推荐阅读The Module Search Path

【讨论】:

以上是关于Python 在同一文件夹中找不到模块的主要内容,如果未能解决你的问题,请参考以下文章

在 virtualenv 中找不到 Python 模块

在文件系统中找不到 python 的标准库

OSError: [WinError 126] 在 Python 中找不到指定的模块

在 anaconda 中找不到 sklearn 模块

Python 2.7 在其搜索路径中找不到模块

解决安装Python后IDA中找不到Python模块的问题