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\nRun 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)\nRun Code Online (Sandbox Code Playgroud)\n\n# ./oldname/__init__.py\n\nimport sys, myapi\nfrom myapi import *\n\nsys.modules['oldname'] = myapi\nRun Code Online (Sandbox Code Playgroud)\n\n似乎有效,但不知道是否存在任何边缘情况或是否有更好的解决方案和/或更规范的解决方案。
\n| 归档时间: |
|
| 查看次数: |
498 次 |
| 最近记录: |