似乎无法使用__init__.py导入模块

时间:2015-12-04 14:29:17

标签: python python-2.7 import

当有人回答这个问题时,我会觉得自己像个完全白痴,因为我知道我之前已经这样做了。

使用Python 2.7.5

我有以下文件结构:

sandbox/
|-- fun
|   |-- __init__.py
|   `-- spock.py
|-- __init__.py
`-- something
    |-- blah.py
    `-- __init__.py

请注意,每个级别都有一个__init__.py文件。每个__init__.py都是空的。

spock.pyblah.py非常简单。

spock.py

def helpmespock():
    print "help me spock!"

blah.py

import fun.spock

fun.spock.helpmespock()

从沙箱和沙盒/某事执行blah会导致同样的错误:

[me@computer sandbox]$ python something/blah.py 
Traceback (most recent call last):
  File "something/blah.py", line 1, in <module>
    import fun.spock
ImportError: No module named fun.spock

我做错了什么?为什么我无法从spock.py导入blah.py

解决

感谢所有回复的人。所有这些都很有帮助。

除了直接执行blah.py之外,我所做的一切都是正确的。我在顶层添加了test.py,导入blah.py

test.py

import something.blah

something.blah.blah()

所以现在树看起来像这样:

sandbox/
|-- fun
|   |-- __init__.py
|   `-- spock.py
|-- something
|   |-- blah.py
|   `-- __init__.py
`-- test.py

执行test.py给了我:

[sri@s6000-devel sandbox]$ python test.py
help me spock!

5 个答案:

答案 0 :(得分:1)

您需要添加sys.path

import os, sys                                                                  

sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))
import fun.spock                                                                

fun.spock.helpmespock() 

答案 1 :(得分:1)

尝试在您的路径中添加“..”:

import sys
sys.path.append("..")
from fun import spock

print spock.helpmespock() 

答案 2 :(得分:1)

问题是,您是直接运行blah.py并且导入无法将sandbox.fun.spockfun.spock解析为父级,因为__name__被评估为"__main__"

因此,__name__应为"sandbox.something.blah"sandbox必须在路径中:

  1. 正确导入sandbox / something / blah.py:

    from ..fun import spock
    
    spock.helpmespock()
    

    甚至更好

    from ..fun import spock
    
    def do():
        spock.helpmespock()
    
  2. 创建一个测试blah的主程序(sandox /../ test.py):

    import sandbox.something.blah
    
    sandbox.something.blah.do()
    

答案 3 :(得分:0)

尝试绝对意义上的导入

import sandbox.fun.spock

答案 4 :(得分:0)

我不知道这是否与其他人有关;但是我遇到了这个问题,因为我的系统(Mac OSX 10.15.6)带有Conda 4.8.3,bashrc没有正确初始化,并且连续默认为系统python

# Open terminal:
python --version  # Python 3.7.7
which python  # $HOME/anaconda3/envs/env_name/bin/python
source $HOME/.bashrc
python --version  # Python 2.7.16
which python  # /usr/local/bin/python

结果,我的python界面使用了错误的python版本(2.7而不是3.7)。如果有帮助,请在运行代码之前立即检查版本。就我而言,版本是在开发过程中进行部分切换的。