出于历史原因和向后兼容的原因,我想用以下两种方式来打包模块(我们将其称为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 myapi
或pip install --user myapi
常规安装的。
也就是说,我在打包单个软件包时要以另一个名称myapi
为oldname
的完整模块结构起别名,以便用户可以使用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
)。有什么建议么?有更好的方法吗?
答案 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
似乎可行,但不知道是否存在边缘情况,或者是否有更好的解决方案和/或更多规范的解决方案。