如何使用顶级函数创建PyPi包

2024-09-25 02:35:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在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验证)


Tags: 模块pipfrompyimport目录脚本pypi
2条回答

导入时,__init__.py中的命名空间似乎可以通过ucal.*语法访问。一种选择是用ucal.py的内容替换__init__.py。这似乎不太正确

另一个选项是在__init__.py中添加import语句:

from ucal.ucal import calculate

这看起来也很混乱,但也许这是公认的做事方式

ucal/ucal.py中,使用^{}变量声明要导出的公共名称:

# ucal/ucal.py

__all__ = ["calculate"]

def calculate(...):
    ...

ucal/__init__.py中,使用*import将这些名称拉入顶级命名空间:

# ucal/__init__.py

from ucal.ucal import *

现在,用户将在顶级命名空间中看到calculate

相关问题 更多 >