Python导入在主机上工作但不在VM内部工作

时间:2017-07-13 20:09:00

标签: python ubuntu docker vagrant python-import

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中创建了相同的文件夹/文件,但它确实有效。

2 个答案:

答案 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时要小心你的命名约定。