python - 如何让第二个 __init__.py 执行相同的命名空间

标签 python python-2.7 namespaces package python-import

这是我的目录结构

.
|-- path1
|   `-- mynms
|       |-- __init__.py
|       `-- app1
|           |-- __init__.py
|           `-- foo.py
|-- path2
|   `-- mynms
|       |-- __init__.py
|       `-- app2
|           |-- __init__.py
|           `-- bar.py
`-- user.py

文件内容:

$ cat user.py
#!/usr/bin/python

import sys
sys.path.append('path1')
sys.path.append('path2')

from mynms.app2.foo import foo
from mynms.app2.bar import bar

foo()
bar()

$ cat path1/mynms/__init__.py;echo ==============;cat path2/mynms/__init__.py
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)

print "I am path1/mynms/__init__.py"
==============
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)

print "I am path2/mynms/__init__.py"

$ cat path1/mynms/app1/foo.py; echo ============; cat path2/mynms/app2/bar.py
def foo():
  print "foo!"
============
def bar():
  print "bar!"

问题:当我运行 user.py 时,我只得到 path1/__init__.py 的输出,但没有得到 path2 的输出。有什么办法可以解决这个问题吗?

$ ./user.py
I am path1/mynms/__init__.py        -----> Why is 'I am path2/mynms/__init__.py not printed?
foo!
bar!

最佳答案

当您编写 import mynms.app2.foofrom mynms.app2.foo import foo 时,Python 会执行以下操作:

  • 通过查找文件 mynms/__init__.py 导入 mynms,它在 path1
  • 中找到
  • 通过查找文件mynms/app1/__init__.py(或mynms/app1.py)导入mynms.app1<
  • 通过查找mynms/app1/foo.py(或mynms/app1/foo/__init__.py导入mynms.app1.foo >)

在下一个 import 语句 import mynms.app2.bar 中,Python 会:

  • import mynms - 它已被导入,因此无需执行任何操作。 (您可以检查 sys.modules['mynms'] 以查看它是否已经导入。如果没有,它会引发 KeyError。)
  • import mynms.app2 - 同样,它已经被导入了。
  • 通过读取path2中的文件mynms/app2/bar.py导入mynms.app2.bar

Python 没有(明智的)方法从两个不同的文件导入 mynms 模块两次。

如果您有初始化代码,您需要将它们放在模块 mynms.app1mynms.app2 中,以便它们具有不同的名称。即文件 mynms/app1/__init__.pymynms/app2/__init__.py

关于python - 如何让第二个 __init__.py 执行相同的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24414647/

相关文章:

python - 使用 matplotlib 删除或调整图例框架的边框

python - chrome_options.binary_location() TypeError : 'str' object is not callable

python-2.7 - 如何在 Python 2.x 中获取系统默认编码?

c++ - 有没有办法在单独的 .h 和 .cpp 文件中定义在命名空间中声明的函数?

python - 为什么从 np.ones 和 np.zeros 创建的图像都显示黑色空白图像,而将两者结合起来会产生预期的黑白混合图像?

python - PySide + QTableView 示例

python - 根据是否在列表中过滤python数据表的行

python - centos上python 2.7专门安装MySQLdb

xml - 反 XML scala 隐藏 xml 属性

c++ - 使用 C++ 并尝试 "nest"一些代码