я не знаю почему
$ echo -e "test1\ntest2\ntest3" | python -c "import sys; for i in sys.stdin: print(i)"
дает неверный синтаксис:
File "<string>", line 1
import sys; for i in sys.stdin: print(i)
^^^
SyntaxError: invalid syntax
он отлично работает при использовании понимания списка:
$ echo -e "test1\ntest2\ntest3" | python -c "import sys; [print(i) for i in sys.stdin]"
приводит к:
test1
test2
test3
Тем не менее, echo -e
— это в первую очередь плохая форма. printf '%s\n' test1 test2 test3
гораздо лучше - или printf '%b\n' 'test1\ntest2\ntest3'
, если нельзя изменить строку для форматирования/печати. См. unix.stackexchange.com/questions/65803/…
@slothrop спасибо, мне было интересно, какой альтернативный разделитель ';' было бы в этом случае. '\n' поначалу кажется немного трудным для чтения, но, возможно, это вопрос привыкания.
@CharlesDuffy спасибо, что указали на это, раньше я понятия не имел об этой проблеме.
Оператор в Python — это либо один составной оператор, либо один или несколько простых операторов, разделенных ;
s. Составные операторы — это те, которые состоят из строки, заканчивающейся :
, за которой следует один или несколько дополнительных операторов. Вы не можете соединить их с помощью ;
, потому что было бы неоднозначно, была ли точка с запятой частью вложенного блока или завершала составной оператор.
Из https://docs.python.org/3/reference/grammar.html
statement: compound_stmt | simple_stmts
simple_stmts:
| simple_stmt !';' NEWLINE # Not needed, there for speedup
| ';'.simple_stmt+ [';'] NEWLINE
simple_stmt:
| assignment
| star_expressions
| return_stmt
| import_stmt
| raise_stmt
| 'pass'
| del_stmt
| yield_stmt
| assert_stmt
| 'break'
| 'continue'
| global_stmt
| nonlocal_stmt
compound_stmt:
| function_def
| if_stmt
| class_def
| with_stmt
| for_stmt
| try_stmt
| while_stmt
| match_stmt
это объясняет это, спасибо и спасибо за ссылку на грамматику python
Вы можете заставить это работать, если поместите разрывы строк и отступы в:
echo -e "test1\ntest2\ntest3" | python -c $'import sys\nfor i in sys.stdin:\n\tprint(i)'