As the question states, I would like to know how to execute arbitrary python code in a windows terminal (or Anaconda Prompt). Please note that I am on Windows. In general, terminal execution is something like:
>>python -c "print('Some Text to Print')"
But what happens if I have multiple lines with indents and indent-indents. Here is an example of things I have tried (please note that I am forcing two lines here in some way, the solution "for i in range(10): print(i)" is not appropriate to the question since this only has one line of python code):
>>python -c "for i in range(10):; print(i)"
>>python -c "for i in range(10):\nprint(i)"
>>python -c "for i in range(10):\n print(i)"
>>python -c "for i in range(10):\n\tprint(i)"
Now clearly I can do this:
>>python -c "exec('for i in range(10):\n\tprint(i)')"
and this solution works. But this solution feels wrong. Is there a more pythonic way? In particular, why do the newline and tab characters work for "exec()" but not for "python -c"?
Have you already tried with ^ ?
In this case if you will not be careful with spaces, you will obtain an IndentationError: unexpected inden
python -c ^
More? "for i in range(2): ^
More? print(i)"
[EDIT]
There are also another way:
python -c ^
More? "for i in range(2):^ print(i)"
0
1
^ is the EOL character used as the new line character in most other non-Unix operating systems, including Microsoft Windows and Symbian OS.
You can do
> echo "for i in range(2):
>> print(i)
>> " | python
0
1
Related
I have a simple shell script where i want to be able to pass variables to some inline python i will write. For example like this
funny=879
echo $funny
python -c "
print(f"hello {$funny}")
"
However this prints
879
File "<string>", line 2
print(fhello
^
SyntaxError: unexpected EOF while parsing
(pipeline) $
Any thoughts on what i could be doing wrong? I know i am setting the variable correct because when i do echo it prints out the variable so it is definitely set correct but for some reason python script is not able to use it.
It's because you're using outer double quotes.
python -c "print(f"hello {$funny}")"
Gets turned into:
python -c print(fhello {879})
So python is passed 2 separate strings.
The inner double quotes would need to be escaped in order to get passed through to python.
$ funny=879; python3 -c "print(f\"hello $funny\")"
hello 879
Instead of messing around with quoting - if you export your variables you can access them from python using the os.environ dict.
$ export funny=879; python -c 'import os; print(os.environ["funny"])'
879
You can use the var=value command syntax and omit the export (note the lack of a semicolon)
$ funny=879 fonny=978 python3 -c 'import os; print(os.environ["funny"], os.environ["fonny"])'
879 978
I aimed to open multiple files (one by one, using for loop in bash terminal) and modify it using PLINK (a programme) and later on, python function. Following are the codes:
for i in {1..10}; do
plink --cow --noweb --lfile $i --extract extract1.snp --recode --out 1$i
python -c 'import file_convert;file_convert.convert_tree_mix("1$i.map","tmp$i")'
done
But, as expected, python could not read and could not open "11.map", it did not replace "$i" with 1. How can i modify the code so that python function, in combination with for loop, open different file each time based on the value of "i"
Have you tried calling python like that:
python -c 'import sys; import file_convert;file_convert.convert_tree_mix(sys.argv[1],sys.argv[2])' "1$i.map" "tmp$i";
?
You need to include the whole python code inside double quotes, so that the $1 inside the python code will expand. $1 in shell refers to the first parameter.
python -c "import file_convert;file_convert.convert_tree_mix(\"1$i.map\",\"tmp$i\")"
I need to interpret a python program line by line. I am using -c option to python and have makefile like this.
all:
python -c
"print 'aa'
print 'bb'"
When I run it with make I get
python -c "print 'aa'
/bin/sh: -c: line 0: unexpected EOF while looking for matching `"'
/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** [all] Error 2
when I take out the same python lines and run from bash, it works fine. What could be the problem?
If your Makefile truly is
all:
python -c
"print 'aa'
print 'bb'"
I would expect to see more errors. With that makefile, make will first attempt to run python -c, which should generate errors like:Argument expected for the -c option. It will then abort and not even try to run the shell command "print 'aa'. You need line continuations and semi-colons.
all:
python -c \
"print 'aa'; \
print 'bb'"
The semi-colon is necessary because make strips all the newlines and passes the string python -c "print 'aa'; print bb'" to the shell (whatever SHELL is set to).
Every line of a make rule is executed in a different shell instance. You need to escape the newlines (with \) or put it all on one line.
Also the makefile snippet as given should be giving you an error about unexpected arguments to -c. Your error indicates that your snippet is actually:
all:
python -c "print 'aa'
print 'bb'"
Not that that changes anything.
Have a look at this question. I think your problem is that your program is spanning multiple lines, but your makefile isn't interpreting it that way. Adding slashes should clear that up.
Multiline bash commands in makefile
I am trying to input a string using echo into a Python one liner then perform a Caeasar's Cipher on the string.
One of the examples my instructor gave me was this.
~ $ echo "Hello Holly." | python -c "import sys; [print(line) for line in sys.stdin]"
The output is suppose to be: Hello Holly.
How ever when I type the command in I get:
File "<string>", line 1
import sys; [print(line) for line in sys.stdin]
^
SyntaxError: invalid syntax
I would appreciate it if someone could point out the error to me. I am using Python 2.6 on Centos 6.
Thanks.
In Python 2 print is a statement, not a function. Try this instead:
echo "Hello Holly." | python -c "import sys; print [line for line in sys.stdin]"
Alternatively, you could use the following to just print plain text (thanks #mgilson):
echo "Hello Holly." | python -c "import sys; print ' '.join([line for line in sys.stdin])"
It looks like you are using python2 while your isntructor is using python 3.
Is there a way to loop in while if you start the script with python -c? This doesn't seem to be related to platform or python version...
Linux
[mpenning#Hotcoffee ~]$ python -c "import os;while (True): os.system('ls')"
File "<string>", line 1
import os;while (True): os.system('ls')
^
SyntaxError: invalid syntax
[mpenning#Hotcoffee ~]$
[mpenning#Hotcoffee ~]$ python -V
Python 2.6.6
[mpenning#Hotcoffee ~]$ uname -a
Linux Hotcoffee 2.6.32-5-amd64 #1 SMP Sun May 6 04:00:17 UTC 2012 x86_64 GNU/Linux
[mpenning#Hotcoffee ~]$
Windows
C:\Users\mike_pennington>python -c "import os;while True: os.system('dir')"
File "<string>", line 1
import os;while True: os.system('dir')
^
SyntaxError: invalid syntax
C:\Users\mike_pennington>python -V
Python 2.7.2
C:\Users\mike_pennington>
I have tried removing parenthesis in the while statement, but nothing seems to make this run.
python -c $'import subprocess\nwhile True: subprocess.call(["ls"])'
would work (note the $'...' and the \n).
But it could be that it only works under bash - I am not sure...
Multiline statements may not start after a statement-separating ; in Python – otherwise, there might be ambiguities about the code blocks. Simply use line breaks in stead of ;. This "works" on Linux:
$ python -c "import os
while True: os.system('ls')"
Not sure how to enter this on Windows, but why not simply write the commands to a .py file if it's more than one line?
Don't know about windows, if all you want is to be able to type in one-liners, you could consider line breaks inside quotes:
% python -c "import os;
while (True):
os.system('ls')"
If you really must do this in windows, you could use exec:
python -c "exec \"import os;\rwhile True:\r os.system('dir')\""
(I substituted dir so it works on my windows system)