Phi*_*ert 6 python command-line-interface python-wheel python-poetry
我想使用诗歌分发一个 python 包并使其作为 cli 可执行,就像black, pipenv, poetry,flake8朋友一样。
示例用法如下:
\npython -m my-package [args]\nRun Code Online (Sandbox Code Playgroud)\n到目前为止,我已经成功构建了一个轮子并使用以下配置将其安装在 docker 映像上:
\npyproject.toml
[tool.poetry]\nname = "my-package\nversion = "0.1.0"\ndescription = "A cli tool"\nauthors = []\npackages = [\n { include = "src/main.py" },\n]\n\n[build-system]\nrequires = ["poetry-core>=1.0.0"]\nbuild-backend = "poetry.core.masonry.api"\nRun Code Online (Sandbox Code Playgroud)\n构建命令:
\npoetry build -f wheel\npoetry export -o dist/requirements.txt\nRun Code Online (Sandbox Code Playgroud)\nDocker 镜像:
\nFROM python:3.8-slim as base\n\nCOPY dist/requirements.txt /requirements.txt\nRUN pip install --no-cache-dir --upgrade -r /requirements.txt\nARG APP_VERSION\nCOPY dist/my-package-$APP_VERSION-py3-none-any.whl .\nRUN pip install --no-cache-dir --no-deps my-package-$APP_VERSION-py3-none-any.whl\nRun Code Online (Sandbox Code Playgroud)\n使用以下命令构建:
\ndocker build -t my-package:latest --build-arg APP_VERSION=$(poetry version -s) .\nRun Code Online (Sandbox Code Playgroud)\n并使用以下命令运行:
\ndocker run -it my-package:latest /usr/local/bin/python -m my-package\nRun Code Online (Sandbox Code Playgroud)\n结果是:
\n/usr/local/bin/python: No module named my-package\nRun Code Online (Sandbox Code Playgroud)\n在本地,我可以通过执行以下操作来执行它:
\ncd src\npython main.py [args]\nRun Code Online (Sandbox Code Playgroud)\n如何安装/打包一个wheel以使其作为cli可执行?
\n附加日志:
\n\xe2\x95\xb0\xe2\x94\x80 docker build -t my-package:latest --build-arg APP_VERSION=0.1.0 .\n[+] Building 1.9s (10/10) FINISHED \n => [internal] load build definition from Dockerfile 0.0s\n => => transferring dockerfile: 353B 0.0s\n => [internal] load .dockerignore 0.0s\n => => transferring context: 2B 0.0s\n => [internal] load metadata for docker.io/library/python:3.8-slim 0.9s\n => [1/5] FROM docker.io/library/python:3.8-slim@sha256:0f6d6953c6612786ed05aaf1de7151dbbb0cea6bc83687040d5f15377be7ef64 0.0s\n => [internal] load build context 0.0s\n => => transferring context: 6.12kB 0.0s\n => CACHED [2/5] COPY dist/requirements.txt /requirements.txt 0.0s\n => CACHED [3/5] RUN pip install --no-cache-dir --upgrade -r /requirements.txt 0.0s\n => CACHED [4/5] COPY dist/my-package-0.1.0-py3-none-any.whl . 0.0s\n => [5/5] RUN pip install --user --no-cache-dir --no-deps my-package-0.1.0-py3-none-any.whl 0.9s\n => exporting to image 0.0s\n => => exporting layers 0.0s\n => => writing image sha256:4f41ba75b6bbacd33d64a06eed921c1ca8aeca55e9340536b9208fcb694826dd 0.0s \n => => naming to my-package:latest 0.0s\n\nUse 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them\n'package' took 2.9720 sec\n\n\n\xe2\x95\xb0\xe2\x94\x80 docker run -it my-package:latest /bin/bash\nroot@f61d2505e762:/# python -m my-package\n/usr/local/bin/python: No module named my-package\nroot@f61d2505e762:/# python -m my-package\n/usr/local/bin/python: No module named my-package\nroot@f61d2505e762:/# pip freeze > req.txt\nroot@f61d2505e762:/# cat req.txt\ncertifi==2021.10.8\ncharset-normalizer==2.0.9\nidna==3.3\nmy-package @ file:///my-package-0.1.0-py3-none-any.whl\npsycopg2-binary==2.9.2\nrequests==2.26.0\nurllib3==1.26.7\nRun Code Online (Sandbox Code Playgroud)\n
python -m app与使用命令相比,通过使用不同的机制运行 python 应用程序app。
让我们假设以下项目结构:
\ndemo-cli\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 demo_cli\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __main__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 cli.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 poetry.lock\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pyproject.toml\nRun Code Online (Sandbox Code Playgroud)\npyproject.toml:
[tool.poetry]\nname = "demo-cli"\nversion = "0.1.0"\ndescription = ""\nauthors = ["finswimmer <finswimmer77@gmail.com>"]\npackages = [{include = "demo_cli"}]\n\n[tool.poetry.dependencies]\npython = "^3.10"\n\n[tool.poetry.scripts]\ndemo-cli = "demo_cli.cli:say_hello"\n\n[build-system]\nrequires = ["poetry-core"]\nbuild-backend = "poetry.core.masonry.api"\nRun Code Online (Sandbox Code Playgroud)\ncli.py:
demo-cli\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 demo_cli\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __main__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 cli.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 poetry.lock\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pyproject.toml\nRun Code Online (Sandbox Code Playgroud)\n__main__.py:
[tool.poetry]\nname = "demo-cli"\nversion = "0.1.0"\ndescription = ""\nauthors = ["finswimmer <finswimmer77@gmail.com>"]\npackages = [{include = "demo_cli"}]\n\n[tool.poetry.dependencies]\npython = "^3.10"\n\n[tool.poetry.scripts]\ndemo-cli = "demo_cli.cli:say_hello"\n\n[build-system]\nrequires = ["poetry-core"]\nbuild-backend = "poetry.core.masonry.api"\nRun Code Online (Sandbox Code Playgroud)\n这部分通过定义应该执行的方法pyproject.toml给我们一个命令:demo-cli
[tool.poetry.scripts]\ndemo-cli = "demo_cli.cli:say_hello"\nRun Code Online (Sandbox Code Playgroud)\n的内容__main__.py在 上触发python -m demo_cli。所以我们需要在那里添加方法调用。更详细的信息可以从这里找到。
| 归档时间: |
|
| 查看次数: |
6996 次 |
| 最近记录: |