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