如何将我的 python 项目打包为可从命令行运行?

How to package my python project to be runnable from command line?

我已经编写了我的 python 项目并成功发布它来测试 pypi。但是,现在我不知道如何将它正确配置为控制台脚本。在命令行上 运行ning my_project 后,我得到以下堆栈跟踪:

Traceback (most recent call last):
  File "/home/thatcoolcoder/.local/bin/my_project", line 5, in <module>
    from my_project.__main__ import main
ModuleNotFoundError: No module named 'my_project'

显然,它为 运行 创建了一个脚本,但该脚本无法导入我的实际代码。

文件夹结构:

pyproject.toml
setup.cfg
my_project
├── __init__.py (empty)
├── __main__.py

setup.cfg的相关章节:

[metadata]
name = my-project
version = 1.0.5

...

[options]
package_dir =
    = my_project
packages = find:

...

[options.packages.find]
where = my_project

[options.entry_points]
console_scripts =
    my_project = my_project.__main__:main

pyproject.toml(可能不相关)

[build-system]
requires = [
    "setuptools>=42",
    "wheel"
]

__main__.py:

from my_project import foo

def main():
    foo.bar()

if __name__ == '__main__':
    main()

为了构建和上传,我运行宁以下:(python 是 python 3.10)

python -m build
python -m twine upload --repository testpypi dist/*

然后安装 运行:

pip install -i https://test.pypi.org/pypi/ --extra-index-url https://pypi.org/simple my-project --upgrade

my_project

我怎样才能让这个控制台脚本工作?

另外,目前这种设置console_scripts的方法只允许运行如my_project;是否也可以通过 python -m my_project 使其工作?或者一旦我的主要问题得到解决,这可能会起作用。

这很有趣,但我在尝试在多个平台上安装脚本时遇到了同样的挫败感。 (正如 Python 对它们的称呼;posixnt。)

所以我在 2020 年写了 setup-py-script。现在 github 上线了。

它安装使用自己的模块作为独立 zip 文件的脚本。 (此方法的灵感来自 youtube-dl。)这意味着当您删除脚本但忘记删除模块等时,不会再有剩余文件。

不需要 root 或管理员权限;安装在用户可访问的目录中完成。

您的项目结构可能需要略有不同;脚本本身不在模块目录中。请参阅项目自述文件。

我今天终于回到了这个问题,看来我使用了不正确的源布局,导致 pip 模块安装无法正常工作。我切换到这样的目录结构:

├── src
│   └── mypackage
│       ├── __init__.py
│       └── mod1.py
├── setup.py
└── setup.cfg

并修改了我的setup.cfg:

的相关部分
[options]
package_dir=
    =src
packages=find:

[options.packages.find]
where=src

然后我可以 运行 像 python -m mypackage 一样。这也使控制台脚本工作。它适用于 Linux,但我认为它也适用于其他系统。