如何在打包时为python模块添加别名?
出于历史原因和向后兼容性,我希望以一种方式打包一个模块(我们称之为如何在打包时为python模块添加别名?,python,module,packaging,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
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
或新名称(此处myapi
)导入任何模块,而无需复制代码。Python或setuptools
中有什么东西可以实现这一点吗
不适合我的备选方案:
我知道用户只需执行以下操作:
import myapi as oldname
我的目标是避免混淆,因为包名在某个时候发生了更改。用户应该能够交替使用新旧名称,而不必知道名称是否已更改
在某些系统上,最简单的方法是在运行setup.py install
时创建一个符号链接:
ln -s /usr/local/lib/python2.7/dist-packages/myapi \
/usr/local/lib/python2.7/dist-packages/oldname
但这是一种很有技巧的方法,它肯定会混淆Python的导入系统,并导致其他问题(
oldname.\uu\u\u\u
,pip show oldname
等等)。此外,它也不会与车轮一起工作。我更喜欢一种内置的方式,但我对Python打包的了解并没有我所知道的那么深。也许我可以在我的setup.py
(顺便说一句,它使用setuptools
)。有什么建议吗?有更好的方法吗?我最终使用的是以下软件包结构:
$ 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