[英]How to create PyPi package with top-level functions
我正在尝试在 PyPi 上安装一个包,但无法将其配置为具有所需的语法。 归根结底,我希望能够使用以下语法在我的模块中使用一个函数:
import ucal
ucal.calculate(...)
此语法遵循所有公共库。 (也可以使用from ucal import calculate
)。
我的目录结构如下:
ucal/
ucal/
__init__.py
ucal.py
ucal_units.py
setup.py
在 ucal.py 中:
import ucal_units
def calculate():
pass
我可以上传到 PyPi,然后使用 pip 安装:
> python setup.py bdist_wheel
> python -m twine upload dist/ucal-0.1.3-py3-none-any.whl
(wait a minute)
> pip install --user ucal
但是,在新脚本中,以下脚本会产生错误:
import ucal
ucal.calculate() # <-- AttributeError: module 'ucal' has no attribute 'calculate'
事实证明,这是有效的:
from ucal import ucal
ucal.calculate()
但我不想要这种愚蠢的语法。 ucal 应该是顶级的。 为了使所需的语法起作用,我需要进行哪些更改?
我尝试将 ucal/ucal 中的所有文件移动到父目录,但这导致ModuleNotFoundError: No module named 'ucal'
即使该模块已安装(已通过 pip list 验证)
在ucal/ucal.py
,使用__all__
变量声明要导出的公共名称:
# ucal/ucal.py
__all__ = ["calculate"]
def calculate(...):
...
在ucal/__init__.py
,使用 * 导入将这些名称拉入顶级命名空间:
# ucal/__init__.py
from ucal.ucal import *
现在,用户将在顶级命名空间中看到calculate
。
导入时, __init__.py
ucal.*
的命名空间似乎可以通过ucal.*
语法访问。 那么,一种选择是将__init__.py
替换为ucal.py
的内容。 这似乎不太正确。
另一种选择是在__init__.py
添加一个 import 语句:
from ucal.ucal import calculate
这似乎也很混乱,但也许这是公认的做事方式?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.