Инструменты настройки python console_scripts с аргументами

Я хочу реализовать свой скрипт pypy.py в командной строке, мне нужно работать с инструментами установки, но скрипт console_script не работает должным образом, так как моему pypy.py требуется два аргумента, пожалуйста, укажите, как мне правильно его изменить, чтобы он работал на commendline.

python.py

def main(agru1, argu2):

    "do something"

 if __name__ == "__main__":
        main()

когда я включаю его в мой файл setup.py, как console_script, как следует

setup( 
     entry_points={
        'console_scripts': [

                'pypy = pypy.pypy:main'],
    }

)

И я получаю следующую ошибку при запуске из командной строки:

Traceback (most recent call last):
File "/usr/local/bin/python", line 9, in <module>
load_entry_point('Pypy==0.1', 'console_scripts', 'pypy')()
TypeError: main() takes at least 2 arguments (0 given)

3 ответа

Точка входа должна быть функцией, которая принимает нулевые аргументы. Если вы хотите передать аргументы из командной строки, скажем, вы хотите вызвать их следующим образом:

$ pypy a1 a2

Вы должны прочитать их из sys.argv вместо. Таким образом, ваш модуль Python должен содержать это:

def program(arg1, arg2):
    print(arg1, arg2)

def main():
    import sys
    arg1, arg2 = sys.argv[1], sys.argv[2]
    program(arg1, arg2)

if __name__ == "__main__":
    main()

Выполнение этой команды, как указано выше, должно распечатать a1 a2 в консоль. Обработка ошибок при вводе пользователем - ваше собственное упражнение.

Подобно ответу metatoaster, вместо использования sys.argv вы можете использовать argsparse https://docs.python.org/3/library/argparse.html, что делает передачу аргументов немного более удобной для пользователя.

import argparse


if __name__ == "__main__":
  parser = argparse.ArgumentParser()
  parser.add_argument('--arg1', help='arg1 help')
  parser.add_argument('--arg2', help='arg2 help')
  args = parser.parse_args()
  print("arg1 {}, arg2 {}".format(args.arg1, args.arg2)

Назовите это так:

pypy --arg1 1 --arg2 2

Недавно столкнулся с похожей проблемой. Я решил это, вызвав скрипт напрямую, используяpython -m <complete_script_path> arg1 arg2.

Например, если имя моего файла сценария — bar, и он присутствует внутри пакета foo, а его содержимое выглядит следующим образом:

foo.py

      def f1(a,b):
    return a+b
if __name__=="__main__":
   a = sys.argv[1]
   b = sys.argv[2]
   f1(a,b)

Я могу вызвать foo следующим образом:

      python -m foo.bar arg1 arg2

Мне не нужно передавать его как console_script внутриsetupфункцияsetuptools.Это решает проблему невозможности передачи аргументов консольным сценариям. Также я могу упаковать его в файл whl во время распространения.

Другие вопросы по тегам