[英]How do I alias a python module at packaging time?
出于历史原因和向后兼容性,我想以这种导入方式打包模块(让我们称之为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
以常规方式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.__name__
, 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
似乎工作,但不知道是否有任何边缘情况或是否有更好的解决方案和/或更多的规范解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.