关于打包第一个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 将
sublime_text/sublime.py
和 sublime_text/sublime_plugin.py
文件复制到 Lib/site-packages
根目录的 "standard" 方法是什么?
- 您如何告诉 setup.py 在
Lib/site-packages
中临时复制整个文件夹 pyblime
?
- 最后,上传tests/examples/tests/docs/data到PyPi是否正确?这是,使用 SDK/library 本身不需要的内容......如果不是,你会在哪里包含这种类型的数据......我知道存在 sdist&dist 文件夹的概念,我我已经阅读了一些相关内容 here 但问题仍然存在 :)
现在我的 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 上即可。够了。
几天前我创建了一个名为 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 将
sublime_text/sublime.py
和sublime_text/sublime_plugin.py
文件复制到Lib/site-packages
根目录的 "standard" 方法是什么? - 您如何告诉 setup.py 在
Lib/site-packages
中临时复制整个文件夹pyblime
? - 最后,上传tests/examples/tests/docs/data到PyPi是否正确?这是,使用 SDK/library 本身不需要的内容......如果不是,你会在哪里包含这种类型的数据......我知道存在 sdist&dist 文件夹的概念,我我已经阅读了一些相关内容 here 但问题仍然存在 :)
现在我的 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 上即可。够了。