【发布时间】:2014-08-16 08:51:48
【问题描述】:
这是我的目录结构
.
|-- 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!
【问题讨论】:
-
你有两个同名的包,这通常是不受欢迎的。为什么您的测试用例包必须同名?你能重命名第二个吗?
-
testcase这个名字有误导性,让我改一下。 -
由于其他原因,我无法将它们更改为不同的命名空间。它们是同一个开发团队的两个应用程序,但出于部署目的必须保持不同的层次结构。
-
Python 2 不支持开箱即用的命名空间包。
setuptools确实添加了命名空间支持,但要复制这种行为需要大量的黑客攻击。当我有更多时间时,我可以总结一下setuptools所做的事情,但您也可以直接使用它来打包您的项目并让setuptools为您管理命名空间为。跨度>
标签: python python-2.7 namespaces package python-import