For loop after import doesn't work in Python one-liner
Asked Answered
S

6

7

If I use import and a for follows afterwards I get an invalid syntax error. I have no idea why this happens.

> python3 -c 'import os; for a in range(1,5): print(a)'
  File "<string>", line 1
    import os; for a in range(1,5): print(a)
                 ^

Removing the import works fine:

> python3 -c 'for a in range(1,5): print(a)'
1
2
3
4

or totally removing the for loop:

> python3 -c 'import os; print(10)'
10

So what's going on??

Siamese answered 6/11, 2014 at 11:19 Comment(0)
C
8

It's an error because it's not in the Python grammar.

If you check out the syntax specification for compound statements, you'll see that a statement list (i.e. what you're making with the semicolon) is defined as:

stmt_list ::= simple_stmt (";" simple_stmt)* [";"]

and the for construct is not a simple_stmt, but instead is a compound_stmt.

The print(10), however, is a simple_stmt and, as such, is just fine.

Cureall answered 6/11, 2014 at 11:28 Comment(0)
R
2

Well in 2022 with python3 you can do this:

python3 -c 'import os; [print(a) for a in range(1,5)]'
Reluct answered 15/6, 2022 at 13:33 Comment(0)
V
1

As you see Python does not allow you to put a block opening statement (like for) into a line with an other statement. In general you should not use the ; inside a script in some situations it (like the command execution of python code with -c) it is the only solution, but inside a script just use a line break.

For details about coding style standards in Python you can read the PEP 8: http://legacy.python.org/dev/peps/pep-0008/

Venom answered 6/11, 2014 at 11:28 Comment(0)
S
1

Convert the single line code to multiple line form and replace the line breaks with "\n". Then pass that as a string to the exec function:

python3 -c "exec('import os\nfor a in range(1,5):\n print(a)')"

Not elegant, but it accomplishes the task without the need for a script file.

Sheetfed answered 30/3, 2023 at 15:13 Comment(0)
K
0

just as another workaround in bash:

python3 -c "import datetime;import sys"$'\n'"for i in range(10): print(i)"

Kreit answered 10/7, 2023 at 10:27 Comment(0)
C
0

It's true that Python syntax doesn't support the for loop as you've written it, but at least you can still use a comprehension to achieve what you've illustrated in your post:

import os; print([a for a in range(1,5)])

Or more accurately:

import os; print("\n".join([str(a) for a in range(1,5)]))
Conyers answered 1/8, 2023 at 19:5 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.