[英]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 myapi
或pip 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.