Python пакет "click" вызывает "Ошибка: получены неожиданные дополнительные аргументы (sdist bdist_wheel)" при использовании в новом пакете - PullRequest
1 голос
/ 24 января 2020

Я пытаюсь создать пакет Python, который можно использовать в качестве команды терминала. Мой файл setup.py выглядит как

import setuptools

# If the package is being updated (and not installed for the first time),
# save user-defined data.
try:
    import checklist
    update = True
except ModuleNotFoundError:
    update = False

if update:
    import os
    import pickle
    dir = os.path.join(os.path.dirname(checklist.__file__), 'user_settings')
    files = {}
    for file in os.listdir(dir):
        files[file] = pickle.load(open(os.path.join(dir, file), "rb"))

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    name="SampleName",
    version="0.2.0",
    author="Author1, Author2",
    author_email="email@email.com",
    description="words words words.",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/samplesample/sample1",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
        "Operating System :: OS Independent",
    ],
    entry_points='''
        [console_scripts]
        checklist=checklist.checklist:cli
    ''',
    python_requires='>=3.7',
    package_data={"checklist":["user_settings/*.pkl"]},
    include_package_data=True,
)

if update:
    for key in files:
        pickle.dump(files[key], open(os.path.join(dir, key), "wb"))

Когда я пытаюсь создать пакет checklist с помощью команды

python setup.py sdist bdist_wheel

, я получаю сообщение

Error: Got unexpected extra arguments (sdist bdist_wheel)

Когда я удаляю click из своего окружения, колесо создается без проблем. Это кажется странным, потому что мой код использует click.

import os
import sys
import csv
import click
import datetime as dt
from datetime import datetime
from contextlib import suppress
import pickle


class UI:

    def __init__(self):
        <set variables>...

    <some methods>...

# noinspection SpellCheckingInspection
class Checklist(UI):

    def __init__(self):
        <set variables>...

        # start the process...
        while self.step_index < len(self.to_do):
            with suppress(ExitException):
                self.step()

    def step(self):
        self.__getattribute__(self.to_do[self.step_index])()
        self.step_index += 1
        self.overwrite = False

    <some methods>...


@click.command()
def cli():
    Checklist()

cli()

Что может быть причиной этого? Как мне это исправить?

1 Ответ

0 голосов
/ 24 января 2020

Удивительно, как несколько небольших отклонений от лучших практик связаны между собой, создавая серьезную проблему. : -)

Проблема с click заключается в следующем. Если установлена ​​click, ваш setup.py импортирует модуль, который вы показали нам выше. И модуль при импорте запускает cli(), говорит, cli() вызывает @click.command(), и он анализирует командную строку (предназначенную для setup.py, а не для click) и выдает ошибку.

Если click НЕ установлен, ваш setup.py попытается импортировать checklist и завершится неудачно с ModuleNotFoundError. Исключение перехватывается и игнорируется в setup.py, и установка продолжается.

Чтобы решить эту проблему, сделайте checklist модулем, который можно запускать (для вызова cli()) и импортировать без вызова cli():

def main():
    cli()

if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...