如何在打包时为 python 模块设置别名?

JCG*_*CGB 5 python packaging module

出于历史原因和向后兼容性,我想以myapi这组导入的方式打包一个模块(让我们称之为):

from myapi.utils import helpers
from myapi.api.rest import MyRest
import myapi
Run Code Online (Sandbox Code Playgroud)

导入相同的代码(不重复),如下所示:

from oldname.utils import helpers
from oldname.api.rest import MyRest
import oldname
Run Code Online (Sandbox Code Playgroud)

假设软件包是使用pip install myapi或以常规方式安装的pip install --user myapi

即,我想在打包时将完整的模块结构别名为myapi另一个名称,以便用户可以使用或新名称(此处)导入任何模块,而无需复制代码。Python中有什么东西可以做到吗?oldname oldnamemyapisetuptools

替代方案,这对我不起作用:

我知道用户可以这样做:

import myapi as oldname
Run Code Online (Sandbox Code Playgroud)

我的目标是避免混淆,因为包名称在某些时候发生了变化。用户应该能够交替使用旧名称和新名称,而根本不必知道名称已更改。

在某些系统上,最简单的方法是在运行时创建一个符号链接setup.py install

ln -s /usr/local/lib/python2.7/dist-packages/myapi \
      /usr/local/lib/python2.7/dist-packages/oldname
Run Code Online (Sandbox Code Playgroud)

但是,这是哈克,并肯定会混淆Python的导入系统并导致其他问题(oldname.__name__pip show oldname和这样)。它也不适用于轮子。我更喜欢内置方式,但对 Python 包装的了解并不像我所了解的那样深入。也许我可以在我的setup.py(顺便说一句。使用setuptools)中放入一些东西。有什么建议?有没有更好的办法?

JCG*_*CGB 10

我最终使用的是以下包结构:

\n\n
$ tree\n./\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 myapi/\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 utils/\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 api/\n\xe2\x94\x82       \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 rest.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0  \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x82\xc2\xa0\xc2\xa0  \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 oldname/\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

这些是文件的相关部分:

\n\n
# ./setup.py\nfrom setuptools import setup, find_packages\n\nsetup(\n    # ...\n    packages=find_packages('./'),\n    package_dir={'': './'},\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n
# ./oldname/__init__.py\n\nimport sys, myapi\nfrom myapi import *\n\nsys.modules['oldname'] = myapi\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n