【问题标题】:Can't seem to import modules using __init__.py似乎无法使用 __init__.py 导入模块
【发布时间】:2015-12-04 14:29:17
【问题描述】:

当有人回答这个问题时,我会觉得自己完全是个白痴,因为我知道我以前做过。

使用 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

我做错了什么?为什么我不能从blah.py 导入spock.py


已解决

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

除了直接执行 blah.py 之外,我所做的一切都是正确的。我在导入blah.py 的顶层添加了test.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!

【问题讨论】:

  • 不,[sri@s6000-devel something]$ python blah.py 文件“blah.py”,第 1 行导入 ..fun.spock ^ SyntaxError: invalid syntax
  • 仍然没有喜悦。 (Python 2.7.5) [sri@s6000-devel something]$ python blah.py File "blah.py", line 1 from .. import fun.spock ^ SyntaxError: invalid syntax
  • 没有init.PYC文件这一事实是否是线索?

标签: python python-2.7 import


【解决方案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. 创建一个 main 来测试 blah (sandox/../test.py):

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

【讨论】:

【解决方案2】:

你需要添加 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() 

【讨论】:

  • something/blah.py 的 python 路径执行是沙盒/something。 blah.py 不知道有趣的路径,因为它是显式执行。如果您在沙盒目录中仅导入 something.blah 创建一个新文件 (test.py),情况会有所不同。执行此文件的路径是沙箱(有趣且众所周知)(抱歉我的英语不好)
  • 你可以通过 sys.path 知道路径
  • 你的英语很好。我知道我之前没有操纵 sys.path 就做到了这一点。你是对的,从沙盒中导入 fun.spock 是正确的。
【解决方案3】:

尝试将“..”添加到您的路径:

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

print spock.helpmespock() 

【讨论】:

  • 这也可以,但我不应该直接操纵搜索路径。 init.py 文件应该使模块可用。对吗?
  • 你是对的,也许这对我们有用:pythonic init.py
【解决方案4】:

尝试绝对意义上的导入

import sandbox.fun.spock

【讨论】:

  • 回溯(最近一次调用最后一次):文件“some/blah.py”,第 1 行,在 中 import sandbox.fun.spock ImportError: No module named sandbox.fun.spock跨度>
  • 你的模块在 python 路径中吗?尝试将自己定位到 sandbox 的父目录中,然后运行代码。
  • 那也行不通。 {[sri@s6000-devel ~]$ python sandbox/something/blah.py Traceback(最近一次调用最后):文件“sandbox/something/blah.py”,第 1 行,在 中 import sandbox.fun.spock ImportError: 没有名为 sandbox.fun.spock 的模块 }
  • 听起来我还没有疯。我正在做的应该有效。
【解决方案5】:

我不知道这是否与其他任何人有关;但是我遇到了这个问题,因为我的系统(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)。如果有帮助,请在运行代码之前立即检查版本;在我的例子中,版本在开发过程中被切换了。

【讨论】:

    猜你喜欢
    • 2016-06-14
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多