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书中,在 test 目录中启动了一个python shell。
从那个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)我的项目中没有这样的文件,File&#34; upperlevel / upperlevel.py &#34;,第1行,
3)为什么它搜索 upperlevel.py 而不是 UpperLevel.py
FYI 如果我们这样做&#34; 导入上层&#34;来自UpperLevel.py,它引用自身而不是去上层/ init .py。
更新:
我知道问题出在哪里....我的测试目录(卷)正在mac和vagrant / docker之间共享,某种程度上 UpperLevel.pyc 被视为 upperlevel。 pyc 在该共享卷中。
我没有在共享目录中运行,而是在/ home / vagrant中创建了相同的文件夹/文件,但它确实有效。
答案 0 :(得分:2)
您似乎是在Mac环境中运行,尽管版本相似,但Python默认搜索路径可能与这些版本不同。
尝试比较:
import sys
print(sys.path)
默认安装搜索路径可能不同。
您可以使用环境变量$PYTHONPATH
添加其他导入路径,而我不太喜欢这种方法,在大多数情况下它就足够了。
您还可以在适当的模块安装路径中设置包。
答案 1 :(得分:0)
最后回答我自己的问题...问题是mac有一个不区分大小写的文件系统,当它挂载在linux上时,python试图在不区分大小写的文件中使用ubuntu模式的模块读取方式系统。
经过大量的研究发现了docker https://github.com/docker/for-mac/issues/320的这个链接,所以那些在mac上使用带有python的ubuntu docker时要小心你的命名约定。