【问题标题】:How to package my python project to be runnable from command line?如何将我的 python 项目打包为可从命令行运行?
【发布时间】:2023-03-07 22:39:01
【问题描述】:

我已经编写了我的 python 项目并成功地发布它来测试 pypi。但是,现在我无法弄清楚如何将其正确配置为控制台脚本。在命令行上运行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 is 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 pip setup.py twine


    【解决方案1】:

    这很有趣,但是当我尝试在多个平台上安装脚本时,我也有同样的挫败感。 (正如 Python 所说的那样;posixnt。)

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

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

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

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

    【讨论】:

    • 感谢您的回复,但我更喜欢没有外部库的纯 twine/pip 方法,因为它似乎是可能的(pip 设法做到这一点,http.server 也是如此)。但是,如果我没有得到其他答案,我会试试你的脚本。
    • 安装脚本在 Python 标准库之外没有依赖关系。而且由于您将它们复制到您的项目中,因此它们几乎不是外部的。但祝你好运,让我们知道你发现了什么。
    【解决方案2】:

    我今天终于回到了这个问题,似乎我使用了不正确的源布局,导致 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,但我认为它也适用于其他系统。

    【讨论】:

      猜你喜欢
      • 2016-12-08
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多