Инструменты настройки 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 во время распространения.