繁体   English   中英

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

[英]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 myapipip 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM