Python import 在主机上工作但不在 VM 内工作
Python import working on host but not inside a VM
Python项目目录结构如下
--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
所以在我的本地 MAC 书中 python 2.7.10,在 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 启动了一个虚拟 machine(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 "upperlevel/upperlevel.py", line 1, in
3) 为什么搜索 upperlevel.py 而不是 UpperLevel.py
仅供参考
看起来如果我们从 UpperLevel.py 执行“import upperlevel”,它会返回到自身而不是去 upperlevel/init。 py.
UPDATE:
我知道问题出在哪里....我的测试目录(卷)正在 mac 和 vagrant/docker 之间共享,不知何故 UpperLevel.pyc 在该共享卷中被视为 upperlevel.pyc。
我在 /home/vagrant 中创建了相同的 folders/files 而不是共享目录中的 运行 并且它起作用了。
看来您 运行 来自 Mac 环境,尽管版本相似,但这些构建的 Python 默认搜索路径可能不同。
尝试比较:
import sys
print(sys.path)
默认安装搜索路径可能不同。
您可以使用环境变量 $PYTHONPATH
添加额外的导入路径,虽然我不太喜欢这种方法,但在大多数情况下它已经足够了。
您还可以在正确的模块安装路径中设置您的包。
终于回答了我自己的问题...问题是 mac 有一个不区分大小写的文件系统,当它安装在 linux 上时,python 正在尝试使用 ubuntu 模块读取模式,就像在不区分大小写的文件系统上以区分大小写的方式一样。
经过大量研究发现 link 用于 docker https://github.com/docker/for-mac/issues/320 所以那些在 ubuntu docker 上使用 python 的人mac 请注意您的命名约定。
Python项目目录结构如下
--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
所以在我的本地 MAC 书中 python 2.7.10,在 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 启动了一个虚拟 machine(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 "upperlevel/upperlevel.py", line 1, in
3) 为什么搜索 upperlevel.py 而不是 UpperLevel.py
仅供参考 看起来如果我们从 UpperLevel.py 执行“import upperlevel”,它会返回到自身而不是去 upperlevel/init。 py.
UPDATE:
我知道问题出在哪里....我的测试目录(卷)正在 mac 和 vagrant/docker 之间共享,不知何故 UpperLevel.pyc 在该共享卷中被视为 upperlevel.pyc。
我在 /home/vagrant 中创建了相同的 folders/files 而不是共享目录中的 运行 并且它起作用了。
看来您 运行 来自 Mac 环境,尽管版本相似,但这些构建的 Python 默认搜索路径可能不同。
尝试比较:
import sys
print(sys.path)
默认安装搜索路径可能不同。
您可以使用环境变量 $PYTHONPATH
添加额外的导入路径,虽然我不太喜欢这种方法,但在大多数情况下它已经足够了。
您还可以在正确的模块安装路径中设置您的包。
终于回答了我自己的问题...问题是 mac 有一个不区分大小写的文件系统,当它安装在 linux 上时,python 正在尝试使用 ubuntu 模块读取模式,就像在不区分大小写的文件系统上以区分大小写的方式一样。
经过大量研究发现 link 用于 docker https://github.com/docker/for-mac/issues/320 所以那些在 ubuntu docker 上使用 python 的人mac 请注意您的命名约定。