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

Phi*_*ats 66 python module

我的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!'
Run Code Online (Sandbox Code Playgroud)

和test.py:

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

from hello import hello1

hello1()
Run Code Online (Sandbox Code Playgroud)

仍然python给了我

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

怎么了?

jfn*_*jfn 68

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

from .hello import hello1
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说根本不起作用。我不明白为什么 Python 导入总是如此难以理解的噩梦。 (28认同)
  • 这给了我“ImportError:尝试相对导入没有已知的父包” (20认同)
  • 如果其他人后来发现这个,这称为相对导入,并在python 2.5中添加:https://docs.python.org/2.5/whatsnew/pep-328.html (17认同)
  • 要导入整个模块,请使用`from'。导入你好` (2认同)

Jer*_*len 62

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

您需要从'2014_07_13_test'目录启动python.

打开命令提示符并'cd'进入'2014_07_13_test'目录.

例如:

$ cd /path/to/2014_07_13_test
$ python test.py
Run Code Online (Sandbox Code Playgroud)

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

在test.py中:

import sys, os
sys.path.append('/path/to/2014_07_13_test')
Run Code Online (Sandbox Code Playgroud)

或者设置/编辑PYTHONPATH

一切都应该好......

......你的'shebang'线(你的文件中的第一行)有一个小错误,'#'和'!'之间不应该有空格.

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

此外,您不需要每个文件上的shebang行...只有您打算从shell运行的文件作为可执行文件.

  • 请注意,sys.path.append() 仅添加当前 python 会话的位置,而不是永久添加。 (2认同)

小智 15

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

import os
import sys

file_dir = os.path.dirname(__file__)
sys.path.append(file_dir)
Run Code Online (Sandbox Code Playgroud)

之后,我从同一目录导入没有问题.

  • 虽然这样做有效,但jwn使用相对导入的答案是一种更为干净的解决方案。 (2认同)

Chr*_*ton 12

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


apa*_*ana 8

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

import os.path
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
Run Code Online (Sandbox Code Playgroud)

把它放在模块的顶部,给出错误"没有名为xxxx的模块"