如何在打包时为python模块添加别名?

时间:2019-06-12 10:18:48

标签: python module packaging

出于历史原因和向后兼容的原因,我想用以下两种方式来打包模块(我们将其称为myapi):

from myapi.utils import helpers
from myapi.api.rest import MyRest
import myapi

因此,以上三个语句应基本上导入与以下相同的代码(无重复):

from oldname.utils import helpers
from oldname.api.rest import MyRest
import oldname

假设该软件包是通过pip install myapipip install --user myapi常规安装的。

也就是说,我在打包单个软件包时要以另一个名称myapioldname的完整模块结构起别名,以便用户可以使用oldname或{{1 }},无需重复。

我知道用户可以这样做:

myapi

但是,我的目标是避免混淆,因为软件包名称有所更改。用户应该能够无缝使用旧名称和新名称,而不必完全知道名称已更改,从而最多显示折旧警告。

在某些系统上,最简单的方法是仅在运行import myapi as oldname 时创建符号链接:

setup.py install

但这是很棘手的,并且肯定会混淆Python的导入系统并导致其他问题(ln -s /usr/local/lib/python2.7/dist-packages/myapi \ /usr/local/lib/python2.7/dist-packages/oldname oldname.__name__等)。同样,它也不能与车轮配合使用。我更喜欢一种内置的方式,但是对Python封装的了解还不那么深。也许我可以在pip show oldname中放一些东西(顺便说一下,它们使用setup.py)。有什么建议么?有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我最终使用的是以下软件包strucutre:

$ tree
./
├── myapi/
│   ├── utils/
│   │   ├── ...
│   │   └── __init__.py
│   └── api/
│       ├── rest.py
│       ├── ...
│       └── __init__.py
├── oldname/
│   └── __init__.py
└── setup.py

这些是文件的相关部分:

# ./setup.py
from setuptools import setup, find_packages

setup(
    # ...
    packages=find_packages('./'),
    package_dir={'': './'},
)
# ./oldname/__init__.py

import sys, myapi
from myapi import *

sys.modules['oldname'] = myapi

似乎可行,但不知道是否存在边缘情况,或者是否有更好的解决方案和/或更多规范的解决方案。