这是我的目录结构
.
|-- 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.foo
或 from 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.app1
和 mynms.app2
中,以便它们具有不同的名称。即文件 mynms/app1/__init__.py
和 mynms/app2/__init__.py
。
关于python - 如何让第二个 __init__.py 执行相同的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24414647/