#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. Вы спасаете мой день!