将包作为子模块安装
我有一个第三方的开源包叫“foo”,现在还在测试阶段,我想根据自己的需求对它进行一些调整。所以我不想把它安装在/usr/local/lib/python或者当前的系统路径中,因为我不能频繁地修改顶层包。
foo/
__init__.py
fmod1.py
import foo.mod2
fmod2.py
pass
我想把这个“foo”包安装为我命名空间下的一个子包,比如叫“team.my_pkg”。这样一来,这个包的完整名称就变成了“team.my_pkg.foo”,而不需要修改内部模块中引用“team.my_pkg.foo”的代码,依然可以用“foo”来引用。
team/
__init__.py
my_pkg/
__init__.py
foo/
fmod1.py
import foo.mod2
fmod2.py
pass
一种实现方法是在team.my_pkg.init.py文件中这样做:
import os.path
import sys
sys.path.append(os.path.dirname(__file__))
不过我觉得这样做不太安全。我希望能有一种方法,让只有fmod1.py和fmod2.py可以用“foo”的简短名称来调用,而其他地方都必须使用完整名称“team.my_pkg.foo”。
我的意思是,这样的调用在team/my_pkg/foo之外应该失败:
import team.my_pkg
import foo
而在team/my_pkg/foo之外,这样的调用应该成功:
import team.my_pkg.foo
2 个回答
0
使用明确的相对导入可以让可移动的子包能够引用自己。例如,在fmod1.py文件中:
from . import mod2
2
So I don't want to get it installed in /usr/local/lib/python or anywhere in current sys.path as I can't make frequent changes in top level packages.
这段代码有什么问题呢:
python setup.py develop