使python模块可用作cli工具的最简单方法

问题描述 投票:0回答:2

我想制作一个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'

这是文件中的内容:

setup.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')

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

编辑:

尝试错误的建议后尝试导入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
python module pip command-line-interface
2个回答
1
投票

您未在分发中包括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']
)

0
投票

您正在遵循的指南已经5岁了,有点模糊。您可以像这样设置您的cli工具:

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

setup.py

from setuptools import setup

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

some_module / __ init __。py

from .some_module import *

some_module / some_module.py

def some_func():
    return 42

bin / cli_script

#!/usr/bin/env python3

import some_module

print('hello')
print(some_module.some_func())

然后安装,在modules_and_packages目录中,运行:

~ python setup.py develop

然后运行:

~ cli_script
hello
42

或者,如果您熟悉cookiecutter,我建议将this template用于python软件包,因为它具有内置的cli接口。

© www.soinside.com 2019 - 2024. All rights reserved.