将包作为子模块安装

0 投票
2 回答
1012 浏览
提问于 2025-04-16 09:01

我有一个第三方的开源包叫“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

撰写回答