C
Chris Angelico
Since lines are so critical to Python syntax, I'm a little surprised
there's no majorly obvious solution to this... or maybe I'm just
blind.
Problem: Translate this into a shell one-liner:
import os
for root, dirs, files in os.walk("."):
if len(dirs + files) == 1: print(root)
Solution 1: SyntaxError
python -c 'import os; for root, dirs, files in os.walk("."): if
len(dirs + files) == 1: print(root)'
You can't put a 'for' statement after an 'import' with just a semicolon.
Solution 2: SyntaxError
python -c 'import os\nfor root, dirs, files in os.walk("."): if
len(dirs + files) == 1: print(root)'
You can't put a backslash escape into your code like that! Makes no sense.
Solution 3: Silence
python -c 'import os' -c 'for root, dirs, files in os.walk("."): if
len(dirs + files) == 1: print(root)'
Haven't dug into exactly what this does, but the docs say that -c
terminates the option list, so I would guess that the second -c and
its arg get passed to the script.
Solution 4: Rely on the shell's ability to pass newlines inside arguments
$ python -c 'import os
That works, but at that point, you aren't writing a one-liner any
more. It's also fiddly to edit.
Is there a better way to put multiple virtual lines into a 'python -c' command?
ChrisA
there's no majorly obvious solution to this... or maybe I'm just
blind.
Problem: Translate this into a shell one-liner:
import os
for root, dirs, files in os.walk("."):
if len(dirs + files) == 1: print(root)
Solution 1: SyntaxError
python -c 'import os; for root, dirs, files in os.walk("."): if
len(dirs + files) == 1: print(root)'
You can't put a 'for' statement after an 'import' with just a semicolon.
Solution 2: SyntaxError
python -c 'import os\nfor root, dirs, files in os.walk("."): if
len(dirs + files) == 1: print(root)'
You can't put a backslash escape into your code like that! Makes no sense.
Solution 3: Silence
python -c 'import os' -c 'for root, dirs, files in os.walk("."): if
len(dirs + files) == 1: print(root)'
Haven't dug into exactly what this does, but the docs say that -c
terminates the option list, so I would guess that the second -c and
its arg get passed to the script.
Solution 4: Rely on the shell's ability to pass newlines inside arguments
$ python -c 'import os
for root, dirs, files in os.walk("."):
if len(dirs + files) == 1: print(root)
'
That works, but at that point, you aren't writing a one-liner any
more. It's also fiddly to edit.
Is there a better way to put multiple virtual lines into a 'python -c' command?
ChrisA