当有人回答这个问题时,我会觉得自己像个完全白痴,因为我知道我之前已经这样做了。
使用Python 2.7.5
我有以下文件结构:
sandbox/
|-- fun
| |-- __init__.py
| `-- spock.py
|-- __init__.py
`-- something
|-- blah.py
`-- __init__.py
请注意,每个级别都有一个__init__.py
文件。每个__init__.py
都是空的。
spock.py
和blah.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!
答案 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.spock
或fun.spock
解析为父级,因为__name__
被评估为"__main__"
。
因此,__name__
应为"sandbox.something.blah"
且sandbox
必须在路径中:
正确导入sandbox / something / blah.py:
from ..fun import spock
spock.helpmespock()
甚至更好
from ..fun import spock
def do():
spock.helpmespock()
创建一个测试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)。如果有帮助,请在运行代码之前立即检查版本。就我而言,版本是在开发过程中进行部分切换的。