«zsh: неизвестный атрибут файла: 0» передача кортежа Python в командной строке

#python #zsh

#python #zsh

Вопрос:

Я вызываю скрипт Python (3.8) из терминала на Mac с использованием zsh (5.8), что приводит к появлению сообщения об ошибке в заголовке. Я нашел обходной путь для этой проблемы (хотя и не элегантный), но я хотел бы понять, что происходит не так.

Мой файл Python test.py :

 import argparse
from ast import literal_eval

parser = argparse.ArgumentParser(description="test")
parser.add_argument("--test", default="", type=str, help="test")

args = parser.parse_args()

print(literal_eval(args.test))
 

Вызов этого скрипта из командной строки с использованием python test.py --test (0.4,0.3) приводит к этому сообщению об ошибке zsh: unknown file attribute: 0

Что это значит?


Объяснение о literal_eval :

literal_eval принимает строку like "(0.3,0.4)" и оценивает ее как кортеж s.t.

 a = literal_eval("(0.3,0.4)")
type(a)
<class 'tuple'>
 

Комментарии:

1. Вам не нужен Python для воспроизведения этой проблемы. echo --test (0.4,0.3) сделал бы то же самое.

2. Ваш пользовательский интерфейс не должен ожидать, что пользователь поймет синтаксис Python. Если вам нужен кортеж, вместо этого сделайте что-то вроде add_argument('--test', nargs=2, type=float) .

3. Для того, что zsh делает с paren в конце (даже пустой) строки, в которой генерируется имя файла: zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Qualifiers

4. @chepner спасибо за совет. не знал nargs. с nargs = * это идеально подходит для меня!

Ответ №1:

Лучшим решением было бы заключить строку в кавычки, чтобы вы называли ее как:

 python test.py --test '(0.4,0.3)'
 

Причина ошибки в том, что zsh он пытается использовать магию глобализации для расширения (0.4,0.3) в имена файлов, но, конечно, поскольку вы не собираетесь ее использовать, у вас не совсем правильный синтаксис, отсюда и ошибка. Просто используйте кавычки ' или " для строк

Комментарии:

1. Вы спасаете мой день!