9
votes
python -c 'import sys; print "a"'

works, and

python -c 'for a in [1, 2, 3]: print a'

works, but

python -c 'import sys; for a in [1, 2, 3]: print a'

fails with

File "<string>", line 1
  import sys; for a in [1, 2, 3]: print a
                ^

Why?


EDIT My workaround:

python -c 'import sys; print "\n".join([1, 2, 3])'

(Luckily it worked for my real code too.)

2
What OS and what shell are you using? - user2357112 supports Monica
I can reproduce it ubuntu+bash, python 2.7.3. - Chris Martin
It's not connected to the shell or the -c flag; the same thing happens in the REPL. - user2357112 supports Monica
You're missing a line in the error message: SyntaxError: invalid syntax - wjandrea
Another workaround for Python 3, use a comprehension: python -c 'import sys; [print(i) for i in [1, 2, 3]] - wjandrea

2 Answers

5
votes

You can only use ; to separate non-compound statements on a single line; the grammar makes no allowance for a non-compound statement and a compound statement separated by a semicolon.

The relevant grammar rules are as follows:

stmt: simple_stmt | compound_stmt
simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE

The ; in the simple_stmt production is the only place where semicolons are allowed to separate statements. For further details, see the full Python grammar.

3
votes

Not an answer to your exact question, but still may help someone. You can actually split the command line in shell.

sh/bash/etc:

python -c 'import sys
for a in [1, 2, 3]: print a'

Windows cmd (C:\> and 'More?' are cmd prompts, don't enter those):

C:\>python -c import sys^
More?
More? for a in [1, 2, 3]: print a