Pythonproject目录结构就像
--test
--upperlevel
-- __init__.py
-- manager.py
-- UpperLevel.py
该文件依次包含
# __init__.py
msg = "YAYY printing !!!"
print msg
# UpperLevel.py
from upperlevel import msg
# manager.py
import UpperLevel
因此,在使用python 2.7.10的本地MAC书中,在测试目录中启动了python shell。
从那个壳,
Python 2.7.10 (default, Jul 30 2016, 19:40:32)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import upperlevel.manager
YAYY printing !!!
>>>
有效 !!!!
但是我用vagrant启动了一个虚拟机(ubuntu 14.04和python 2.7.10),并向其中添加了相同的 test 目录。
所以如果我做同样的事情
Python 2.7.10 (default, Jul 13 2017, 19:26:24)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import upperlevel.manager
YAYY printing !!!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "upperlevel/manager.py", line 1, in <module>
import UpperLevel
File "upperlevel/UpperLevel.py", line 1, in <module>
from upperlevel import msg
File "upperlevel/upperlevel.py", line 1, in <module>
from upperlevel import msg
ImportError: cannot import name msg
>>>
所以我的问题是
1)为什么在以后的情况下不起作用,我在docker中尝试了相同的操作并得到了相同的错误
2)我的项目中没有这样的文件,文件“upperlevel / upperlevel.py ”,第1行,在
3)为什么要搜索 upperlevel.py 而不是 UpperLevel.py
费耶
看来,如果我们从UpperLevel.py执行“导入上层”,则它是在返回自身,而不是转到上层/ 初始化 .py。
我知道问题出在哪里..我的测试目录(卷)在Mac和Vagrant / Docker之间共享,以某种方式 UpperLevel.pyc 在该共享卷中被视为 upperlevel.pyc 。
我没有在共享目录中运行,而是在/ home / vagrant中创建了相同的文件夹/文件,并且可以正常工作。
最佳答案
似乎您是在Mac环境中运行的,尽管版本相似,但这些版本的Python默认搜索路径可能会有所不同。
尝试比较:
import sys
print(sys.path)
默认安装搜索路径可能会有所不同。
您可以使用环境变量
$PYTHONPATH
添加其他导入路径,尽管我不太喜欢这种方法,但在大多数情况下它就足够了。您还可以在正确的模块安装路径中设置软件包。