关于打包第一个PyPi项目的问题

Questions about packaging the first PyPi project

几天前我创建了一个名为 pyblime 的小项目,现在我正试图弄清楚如何创建一个合适的 setup.py 以允许我上传 "right stuff" 到 PyPi,这样用户就可以使用 pip 来享受这个项目,而不用做任何事情 "too fancy",比如调用花哨的自定义开发脚本,现在项目树结构如下所示:

│   .gitignore
│   configure.py
│   MANIFEST.in
│   README.md
│   requirements.txt
│   setup.py
│   
├───data
│   ├───commands
│   │       comment.py
│   │       fold.py
│   │       
│   ├───screenshots
│   │       test_simple.png
│   │       test_themes.gif
│   │       
│   ├───st_build_3149
│   │   ├───syntax
│   │   └───themes
│   └───testfiles
├───docs
│       build.md
│       contributing.md
│       guidelines.md
│       usage.md
│       
├───examples
│       demo_00.py
│       tutorials.py
│       tutorial_00.py
│       tutorial_01.py
│       tutorial_02.py
│       tutorial_03.py
│       tutorial_04.py
│       tutorial_05.py
│       tutorial_06.py
│       
├───pyblime
│       utils.py
│       view.py
│       __init__.py
│       
├───sublime_text
│       sublime.py
│       sublime_plugin.py
│       
└───tests
        run_all.py
        test_scopes.py
        test_view.py
        x.py

我有几个简单的疑问,而不是 1 个问题:

现在我的 setup.py 看起来像这样:

from pathlib import Path
from setuptools import setup

root_path = Path(__file__).parent
requirements = (root_path / "requirements.txt").read_text()
requirements = [
    v for v in requirements.split("\n")
    if v.strip() and not v.strip().startswith("#")
]
readme = (root_path / "README.md").read_text()

setup(
    author="mcve",
    author_email="mcve",
    classifiers=["mcve"],
    description="mcve",
    install_requires=requirements,
    keywords=["mcve"],
    long_description=(root_path / "README.md").read_text(),
    name="mcve",
    # package_data = {}, <---- How do i use this?
    # packages = [], <---- Do I need to use this?
    url="mcve",
    version="0.0.1",
)

Ps。是的...我已经阅读了有关包装的官方文档...但如果我理解了这些文档,我就不会在 SO 上问这个问题;D。提前致谢!

嗯,一步一步来吧。


对于第一个问题。大多数情况下,您不应该这样做,相反,您也应该将 sublime_text 视为一个包。结构应如下所示:

├───sublime_text
|       __init__.py
│       sublime.py
│       sublime_plugin.py

并且您应该像 from sublime_text import sublime 一样在您的其他包中使用它。这可能会更好,因为您不会过多地污染全局命名空间。或者,如果这不是您想要在许多其他包之间共享的通用包,您可以直接将其作为子模块包含在主包中。

或者如果你真的想这样做,你可以将这两个文件放在根目录中并使用:

...
packages = find_packages(),
py_modules=["sublime", "sublime_plugin"],
...

对于第二个问题。由于这是一个包,您可以将该路径添加到包中:packages=[""]。或者为了方便,可以使用packages=find_packages()。它将帮助您找到当前目录 "".

下的所有包

关于你的第三个问题。大多数情况下它是不正确的,您只需要将用户需要的内容提交给 PyPi。对于 docs,您应该使用 readthedocs 网站。对于其他示例和测试,只需将它们留在您的 Github 上即可。够了。