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

Question:

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??

Asked By: Pithikos

||

Answers:

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/

Answered By: Klaus D.

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.

Answered By: Joey Coleman

Well in 2022 with python3 you can do this:

python3 -c 'import os; [print(a) for a in range(1,5)]'
Answered By: Jay

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 osnfor a in range(1,5):n print(a)')"

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

Answered By: Robert Simms