在Python中,命名空间包允许您在多个项目中传播Python代码.当您想要将相关库作为单独的下载发布时,这非常有用.例如,使用目录Package-1和Package-2in PYTHONPATH,
Package-1/namespace/__init__.py
Package-1/namespace/module1/__init__.py
Package-2/namespace/__init__.py
Package-2/namespace/module2/__init__.py
Run Code Online (Sandbox Code Playgroud)
最终用户可以import namespace.module1和import namespace.module2.
定义命名空间包的最佳方法是什么,因此多个Python产品可以在该命名空间中定义模块?
我刚刚设置为使用python与Python 2.6.到目前为止,除了处理"导入"语句之外,它运行良好:我似乎无法以与我的程序相同的方式响应导入.
我的目录结构如下:
src/
main.py
util.py
test/
test_util.py
geom/
vector.py
region.py
test/
test_vector.py
test_region.py
Run Code Online (Sandbox Code Playgroud)
要运行,我python main.py从src/调用.
在main.py中,我导入了vector和region
from geom.region import Region
from geom.vector import Vector
Run Code Online (Sandbox Code Playgroud)
在vector.py中,我导入了区域
from geom.region import Region
Run Code Online (Sandbox Code Playgroud)
当我在标准运行中运行代码时,这些都可以正常工作.但是,当我从src /调用"py.test"时,它会一直退出导入错误.
我的第一个问题是,当运行"test/test_foo.py"时,py.test无法直接"导入foo.py".我通过使用"imp"工具解决了这个问题.在"test_util.py"中:
import imp
util = imp.load_source("util", "util.py")
Run Code Online (Sandbox Code Playgroud)
这适用于许多文件.它似乎也暗示当pytest运行"path/test/test_foo.py"来测试"path/foo.py"时,它基于目录"path".
但是,"test_vector.py"失败了.Pytest可以找到并导入vector模块,但它无法找到任何vector的进口.使用pytest时,以下导入(来自"vector.py")都会失败:
from geom.region import *
from region import *
Run Code Online (Sandbox Code Playgroud)
这些都给出了表格的错误
ImportError: No module named [geom.region / region]
Run Code Online (Sandbox Code Playgroud)
我不知道接下来要做什么来解决这个问题; 我对Python中导入的理解是有限的.
使用pytest时处理导入的正确方法是什么?
在vector.py,我更改了import语句
from geom.region import Region
Run Code Online (Sandbox Code Playgroud)
简单地说
from region …Run Code Online (Sandbox Code Playgroud)