Python Command Output Terminal - python

This question is most likely on here somewhere, and anyone who can redirect me, that would be great.
But I can't find it - most likely not sure which appropriate key terms to use as everything gives me the python command line interpreter.
But I simply want to be able to use the output from a python as the input to another program from the command line. For example:
./program `python print 'A' * 100`
However, I get an error of:
python: can't open file 'print': [Errno 2] No such file or directory
What is the proper way to do this?

the python executable with no switches expects no arguments(for an interactive shell) or a *.py file to run
you can use the -c switch to pass in code
./program `python -c "print 'A' * 100"`

python -c "print 'A' * 10" | ./program

Related

Vscode not interactive with python. Mac M1 chip

I am on a Mac with M1 chip and I have a problem with my VScode and python. It stays stuck on the ZSH shell even when I type the command to switch to bash (chsh -s /bin/bash). Lets say I run a simple code:
import cowsay
import sys
if len(sys.argv) == 2:
cowsay.cow("Hello, " + sys.argv[1])
I am supposed to be able to type my name in the shell after my python file name and it should print the cow saying Hello, Noah.
When I do so ((base) noahhaitas#Noahs-Mac-mini ~ % python3 itunes.py Noah Haitas), this is what I get as a message in my shell:
(base) noahhaitas#Noahs-Mac-mini ~ % python3 itunes.py Noah Haitas
/Library/Frameworks/Python.framework/Versions/3.10/bin/python3: can't open file '/Users/noahhaitas/itunes.py': [Errno 2] No such file or directory
I am trying to figure out how I can switch fully to bash and have the $ in front instead of seeing the % of ZSH.
What can be done as this is frustrating and I looked everywhere online and tried pretty much every solution.
Vscode is just an editor, and the system terminal is still applied.
Use the following command in the terminal to switch bash and restart the terminal:
chsh -s /bin/bash
At the same time, you can also set manually in the vscode terminal. Take Windows as an example:
Read the docs for more details about terminal settings.
By the way, there is an error when you run the file. It seems that the python file is not run in the correct directory.

execute command in gnome-terminal using python

I am trying to open one file from gnome-terminal using python. But I am not able to do it.It is just opening terminal and not opening file.
I have tried like:
import os
os.system('gnome-terminal --working-directory = "folder_path" + "[-e, --command=" kate aaa.txt""')
Can anyone please help?
The problem is + "[-e, --command=" kate aaa.txt"", gnome-terminal doesn't know how to parse this + "[ and "", according to the manual, -e and --command mean the same thing:
man gnome-terminal
...
--command, -e=COMMAND
Split the argument to this option into a program and arguments in the same way a shell
would, and execute the resulting command-line inside the terminal.
This option is deprecated. Instead, use -- to terminate the options, and put the program
and arguments to execute after it: for example, instead of gnome-terminal -e "python3 -q",
prefer to use gnome-terminal -- python3 -q.
Note that the COMMAND is not run via a shell: it is split into words and executed as a
program. If shell syntax is required, use the form gnome-terminal -- sh -c '...'.
This works for me in Archlinux:
import os
os.system('gnome-terminal --working-directory = /home/ramsay --command="kate
os"')

Unable to open my source code a second time with `python -i`

When I first start bash I can open my code like so:
$ python -i index.py
That file is open, but when I try again this happens:
>>> python -i index.py
File "<stdin>", line 1
python -i index.py
^
SyntaxError: invalid syntax
If I close bash and start again it works. What am I doing wrong?
You can't run terminal commands from the Python REPL.
You can tell you're in the REPL when you see >>> as opposed to $. This means you can run Python code there, but not shell/terminal commands (like the python command).
To exit the REPL, use Ctrl + Z or type exit() and press enter. This will bring you back to the regular terminal.
In addition, I'd recommend running just python index.py rather than python -i index.py in most cases.
The added -i means that you'd like to stay in the REPL to inspect the results after running the index.py file. It allows you to continue running additional Python code after the index.py file has finished its execution.
It looks by the three >>> that you are in the python console not in bash itself. If you type exit() you should get back to bash, and then you can try the code again.

Interpreting python program line by line from makefile

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

Why do I get 'Bad file descriptor' when trying sys.stdin.read() in subversion pre-revprop-change py script?

I'm trying pre-revprop-change hook script on a Windows machine, but find a tough problem.
I distill my problem to the following scenario:
I have C:\csvn\data\repositories\tr1\hooks\pre-revprop-change.bat with content:
D:\svntest\testhook.py %*
exit %ERRORLEVEL%
testhook.py is:
import os, sys
if __name__ == '__main__':
# sys.stderr.write(sys.version+'\n') # this is OK, tried.
newtext = sys.stdin.read() # try to read new log message
sys.stderr.write('newtext is: %s\n'%newtext)
exit(2)
However, when doing a client-side svn propset svn:log --revprop -r 2 "newtext" , I got python error:
Traceback (most recent call last):
File "D:\svntest\testhook.py", line 5, in <module>
newtext = sys.stdin.read() # try to read new log message
IOError: [Errno 9] Bad file descriptor
What's the cause of this error?
It seems that pre-revprop-change.bat does not pass STDIN handle to the py script. Yes, I verified that pre-revprop-change.bat can fetch text from STDIN(according to instructions in Read stdin stream in a batch file).
I also tried to run pre-revprop-change.bat directly from command line, sys.stdin.read() is OK.
Please kindly help me out.
Screen shot below:
Env:
Windows Server 2003
Collabnet Subversion Edge 2.3(svn 1.7.3 and Apache 2.2.22)
Install Python 2.7.1 msi from python.org
===============[LATEST UPDATE]======================
I'm sorry to say: I should have written in the .bat
exit %ERRORLEVEL%
instead of
exit /b %ERRORLEVEL%
For someone who have tried it with me, please fix it and try again. The /b seems to have pre-revprop-change.bat always exit with 0. TIP: Without /b, running the .bat directly from a cmd window will cause the cmd window to close, so we'd better try it with cmd /c "pre-revprop-change.bat some param".
Quick way to reproduce this problem below
What's more, for those who is still interested, please
download this file package http://down.nlscan.com/misc/chjsvnpyhook.zip ,
extract them to D:\ ,
cd into D:\svntest\tr1_local ,
run elog.bat (svn propset svn:log --revprop -r 2 "newtext")
then my problem will be reproduced. (Requirement: svn.exe 1.7 command line(whether collabnet or TortoiseSVN), and Python 2.7 installed)
If you still cannot reproduce the error. I've prepared a VMware virtual machine that exhibits the problem exactly. Download the VM at http://down.nlscan.com/misc/chj/winxp-svnhook-py-stdin-error.7z (link expected to be valid until Sep 2013). VMware Player 3.0(free) is sufficient to run that VM.
===============[WORKAROUND FOUND]===================
Very nice workaround provided by #nmenezes, with c:\Python27\python.exe D:\svntest\testhook.py %* in bat .
SVN is executing the script without an associated console.
So you won't see anything displayed on STDOUT.
Everything sent to STDERR is displayed as a message on SVN, if the script returns an error code different of 0.
This kind of script should run unattended, it is independent of input or output from the user.
You can try to pass the property value as an extra command line parameter.
To do so, change your .bat to:
#echo off
set /p NEWTEXT=
test.py %* %NEWTEXT%
exit /b %ERRORLEVEL%
And the .py to:
import os, sys
if __name__ == '__main__':
newtext = sys.argv[6]
sys.stderr.write('newtext is: %s\n'% newtext)
exit(2)
I read the batch STDIN to NEWTEXT variable and I pass it to your script as an extra command line parameter.
This solution does not work for multiple lines values. So, I tried again your original solutions and it worked fine.
svn propset svn:log --revprop -r 3 -F svn.txt
In this case, the property value is read from the svn.txt file, a text file with multiple lines. In this case, the option with set /p does not work, as we discussed in the comments. But the original script works.
For information, 5 properties are passed on the command line:
1 - repository
2 - revision number
3 - user
4 - property name
5 - operation (M in this case)
The property value is passed on the stdin of the batch script.
#Chen, I finally downloaded the image. The problem is solved when you change the hook batch to:
c:\python27\python.exe d:\svntest\testhook.py %*
exit %ERRORLEVEL%
It looks that the way your XP machine executes python directly is misconfigured.
Isn't it up to your batch file to direct the stdin it received into the script that it calls?
For reference: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true
Maybe you can just prefix the call to your script with the > symbol to have this happen?
> D:\svntest\testhook.py %*
exit /b %ERRORLEVEL%
It seems like if the batch file can read from stdin, then SVN is doing what it is supposed to and it is up to your batch file to make that available to the additional script that you call.

Categories

Resources