首页 > 解决方案 > 使 python 模块可用作 cli 工具的最简单方法

问题描述

我想制作一个 cli 工具并找到它作为参考:https ://python-packaging.readthedocs.io/en/latest/command-line-scripts.html

所以我创建了一个具有以下结构的目录

$ tree modules_and_packages
modules_and_packages
├── bin
│   ├── cli_script
│   └── cli_script~
├── __init__.py
├── setup.py
├── setup.py~
├── some_module.py
└── some_module.py~

我可以通过 pip 安装模块没有任何问题:

pip3 install ./modules_and_packages
Processing ./modules_and_packages
Installing collected packages: some-module
  Running setup.py install for some-module ... done
Successfully installed some-module-0.0.0

但是当我cli_script在命令行上运行时,出现以下错误:

Traceback (most recent call last):
  File "/home/david/.local/bin/cli_script", line 3, in <module>
    import modules_and_packages
ModuleNotFoundError: No module named 'modules_and_packages'

这是文件中的内容:

安装程序.py

from setuptools import setup

setup(
    name='some_module',
    py_modules=['some_module'],
    scripts=['bin/cli_script']
)

some_module.py

def​ some_func():
    return​ 42

bin/cli_script

#!/usr/bin/env python3

import modules_and_packages
print('hello')

如您所见,我只是想测试使用模块制作命令行工具的最简单情况。我在这里做错了什么?

编辑:

尝试 hoefling 的建议后尝试导入 some_module 时收到错误消息

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/david/.local/lib/python3.6/site-packages/some_module.py", line 1
    ​def​ some_func():
        ^
SyntaxError: invalid character in identifier

标签: pythonmodulepipcommand-line-interface

解决方案


您不包括modules_and_packages在分发中。这是因为您的项目结构是错误的 - 将其与您引用的教程中的结构进行比较。它应该如下所示:

myproject
├── modules_and_packages
│   ├── __init__.py
│   └── some_module.py
├── setup.py
└── bin
    └── cli_script

现在将包包含modules_and_packages到安装脚本中的 dist 中:

# setup.py

setup(
    name='some_module',
    packages=['modules_and_packages'],
    scripts=['bin/cli_script']
)

如果您使用该setuptools.find_packages()功能进行包收集,它会变得更加容易:

from setuptools import find_packages, setup

setup(
    name='some_module',
    packages=find_packages(),
    scripts=['bin/cli_script']
)

推荐阅读