Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在打包时为python模块添加别名?_Python_Module_Packaging - Fatal编程技术网

如何在打包时为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