Самый простой способ сделать модуль python пригодным для использования в качестве инструмента - PullRequest
2 голосов
/ 12 апреля 2020

Я хотел бы создать инструмент 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 после попытки подсказки hoefling

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

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

Вы не включаете 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']
)
1 голос
/ 12 апреля 2020

Руководству, которому вы следуете, 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 , я бы рекомендовал использовать этот шаблон для пакета python, поскольку он имеет встроенный интерфейс cli .

...