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


97

我的python以某种方式无法在同一目录中找到任何模块。我究竟做错了什么?(python2.7)

所以我有一个目录“ 2014_07_13_test”,其中有两个文件:

  1. test.py
  2. 你好

在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

怎么了?


2
您如何执行脚本?另外import sys; sys.path
Salem 2014年

1
试试>>> import test
martineau 2014年

@Casy_fill是否从目录运行程序,文件在哪里?对于导入,导入文件和导入文件共享目录并不重要。重要的是,您的Python解释器已正确设置了当前目录。
Jan Vlcinsky 2014年

Answers:


79

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

您需要从“ 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'行(两个文件的第一行)都存在轻微错误,'#'和'!'之间不应有空格。

有一个更好的家当,你应该使用。

另外,您不需要每个文件上的shebang行,只需要将您打算从Shell中运行的文件作为可执行文件。


非常感谢,那个问题!不幸的是,SublimeRepl(我使用的)现在不支持从文件夹启动python,所以看来我现在需要导出PATH
Philipp_Kats 2014年

以后的读者请阅读直到页面底部,以查看其他非常有用的答案,例如jfn中相对导入的答案。
洪博柱

是的,这是我的问题。我在VS Code中打开了一个很大的Python实践项目文件夹,而在同一目录中查找内容时遇到了很大的问题。我的问题是,在终端中,我没有将目录更改为当前项目所在的子目录。一旦这样做,问题就解决了。
马特·韦斯特

105

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

from .hello import hello1

23
如果以后有人找到它,则称为相对导入,并在python 2.5中添加: docs.python.org/2.5/whatsnew/pep-328.html
sgfit

9
要导入整个模块,请使用from . import hello
ST7

我认为这是一个比最佳答案更好的解决方案。正如ST7所指出的,我使用整个模块导入:from . import local_module
Gene M

24

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

import os
import sys

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

在那之后,我从同一目录导入没有问题。


2
虽然这样做可行,但jwn使用相对导入的答案是一种更为干净的解决方案。
Russ Schultz '18年

15

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

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

将其放在模块顶部,该模块将显示错误“没有名为xxxx的模块”


1
通过将“ ..”替换为“ ../ ..”,这帮助我从父目录加载模块。非常感谢!
Nikola R.

是要导入的文件的文件名,或者是我们要在其中导入模块的当前模块的文件名,或者它是常量
Manoj

9

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


1

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


0

以下内容不能解决OP的问题,但标题和错误正是我所面对的。

如果项目中包含setup.py脚本,则可以使用python3 -m pip install -e .python3 setup.py install或来安装您所在的软件包python3 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

其他解决方案似乎“肮脏”

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

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.