简体   繁体   中英

Piping to a python script from cmd shell

I have a python script (not created by me), let's call it myscript, which I call with several parameters. So I run the script like this in Windows cmd: Code:

/wherever/myscript --username=whoever /some/other/path/parameter

And then a prompt appears and I can pass arguments to the python script:

Process started successfully, blabla
Python 2.7.2 blabla
(LoggingConsole)
>>>

And I write my stuff, then quit to be back into cmd:

>>> command1()
>>> command2()
>>> quit()

I suspect some errors occurring in this part, but only once for a hundred trials. So I want to do it by a script. I want to pipe to this script the internal command1 command2, so that I can test this function thousand times and see when it breaks. I have the following piece of code:

echo 'command1()' | py -i /wherever/myscript --username=whoever /some/other/path/parameter

This unfortunately doesn't generate the same behaviour, as if it would be manually entered. Can I simulate this behaviour with pipes/redirecting output? Why doesn't it work? I expect that the 'command1()' text will be entered when the script waits for the commands, but it seems I'm wrong.

Thanks!

EDIT 16/02/2021 3:33PM:

  1. I was looking for the cmd shell way to solve this, no python stuff
  2. The piece of script
echo 'command1()' | py -i /wherever/myscript --username=whoever /some/other/path/parameter

is almost correct, just remove the '':

echo command1() | py -i /wherever/myscript --username=whoever /some/other/path/parameter

my issues were coming from myscript. Once I fixed the weird things on this side, this part was all ok. You can even put all commands together:

echo command1();command2();quit(); | py -i /wherever/myscript --username=whoever /some/other/path/parameter

This question is adapted from a question of gplayersv the 23/08/2012 on unix.com, but the original purpose made the question not answered.

Easy to have pipes. If you want to get the standard input:

import sys
imput = sys.stdin.read()

print(f'the standard imput was\n{imput}')

sys.stderr.write('This is an error message that will be ignored by piping')

If you want to use the standard input as argument: echo param | xargs myprogram.py echo param | xargs myprogram.py

Python's built-in fileinput module makes this simple and concise:

#!/usr/bin/env python3
import fileinput

with fileinput.input() as f:
    for line in f:
        print(line, end='')

Than you can accept input in whatever mechanism is easier for you:

$ ls | ./filein.py
$ ./filein.py /etc/passwd
$ ./filein.py < $(uname -r)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM