将包作为子模块安装

时间:2010-12-25 15:41:41

标签: python import package

我有一个包第三方开源软件包“foo”;这是处于测试阶段,我想根据我的要求进行调整。因此,我不想将它安装在/ usr / local / lib / python或当前sys.path中的任何位置,因为我无法在顶级软件包中进行频繁更改。

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 :(得分: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

答案 1 :(得分:0)

使用explicit relative imports允许可重定位的子包引用自己。例如在fmod1.py中:

from . import mod2