这是我的目录结构

.
|-- 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
  • 中找到的文件 mynms/__init__.py 来导入 path1
  • 通过查找文件 mynms.app1 (或 mynms/app1/__init__.py )
  • 来导入 mynms/app1.py
  • 通过查找 mynms.app1.foo (或 mynms/app1/foo.py )
  • 来导入 mynms/app1/foo/__init__.py
    在下一个 import 语句 import mynms.app2.bar 中,Python 执行以下操作:
  • import mynms - 它已经导入,所以没有什么可做的。 (您可以检查 sys.modules['mynms'] 以查看它是否已经导入。如果没有,它将引发 KeyError 。)
  • import mynms.app2 - 同样,这已经导入了。
  • 通过读取文件 mynms.app2.bar 导入 o​​jit_code ,该文件位于 mynms/app2/bar.py

  • Python 没有(明智的)方法可以从两个不同的文件中两次导入 path2 模块。

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

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

    10-12 21:58