python - 使 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
解决方案
您不包括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']
)
推荐阅读
- python - Python文件打开然后立即关闭
- ios - 使用文本输入时 Flutter 仅显示 0-9 键盘而不是扩展数字键盘(即所有 ascii 字符都应该可用)
- django - Django 从 ListView 创建模型
- javascript - 如何在汽车的拐角处附加一个旋转圆圈?
- c# - ASP.NET Core MVC 绑定包含 2 个域模型的 Viewmodel
- javascript - 检查文件内容的变化
- php - 如何在 Laravel 表单文本输入中添加静态文本?
- c# - 如何在 xaml 中将最后一个列表框项目与其他列表框项目分开
- python - *args 可以在关键字参数之后使用吗
- arrays - 容量何时与数组末尾不同 - 切片开头?