【问题标题】:How do I alias a python module at packaging time?如何在打包时给 python 模块起别名?
【发布时间】:2019-06-12 10:18:48
【问题描述】:

出于历史原因和向后兼容性,我想以这组导入的方式打包一个模块(我们称之为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.__name__、pip show oldname 等)。它也不适用于轮子。我更喜欢一种内置的方式,但对 Python 打包的了解并不像我知道的那样深入。也许我可以在我的setup.py 中放入一些东西(顺便说一句。使用setuptools)。有什么建议么?有没有更好的办法?

【问题讨论】:

    标签: python module packaging


    【解决方案1】:

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

    $ 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
    

    似乎可行,但不知道是否有任何极端情况或是否有更好的解决方案和/或更规范的解决方案。

    【讨论】:

      猜你喜欢
      • 2012-10-07
      • 1970-01-01
      • 2017-02-22
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      相关资源
      最近更新 更多