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添加其他导入路径,尽管我不太喜欢这种方法,但在大多数情况下它就足够了。

您还可以在正确的模块安装路径中设置软件包。

09-15 15:38