编程语言
首页 > 编程语言> > python-如何对同一名称空间执行第二次__init__.py执行

python-如何对同一名称空间执行第二次__init__.py执行

作者:互联网

这是我的目录结构

.
|-- 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!

解决方法:

当您编写导入mynms.app2.foo或从mynms.app2.foo导入foo时,Python会这样做:

>通过在路径1中找到文件mynms / __ init__.py导入mynms
>通过查找文件mynms / app1 / __ init __.py(或mynms / app1.py)导入mynms.app1
>通过查找mynms / app1 / foo.py(或mynms / app1 / foo / __ init__.py)导入mynms.app1.foo

在下一个导入语句中,导入mynms.app2.bar,Python会执行以下操作:

>导入mynms-它已经被导入,因此无需执行任何操作. (您可以检查sys.modules [‘mynms’]以查看是否已经导入.如果尚未导入,则会引发KeyError.)
>导入mynms.app2-再次,这已经导入.
>通过读取路径2中的文件mynms / app2 / bar.py导入mynms.app2.bar

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

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

标签:python-2-7,python-import,namespaces,package,python
来源: https://codeday.me/bug/20191029/1959772.html