【问题标题】:Piping to a python script from cmd shell从 cmd shell 管道到 python 脚本
【发布时间】:2021-05-19 09:11:28
【问题描述】:

我有一个 python 脚本(不是我创建的),我们称之为 myscript,我用几个参数调用它。 所以我在 Windows cmd 中运行这样的脚本: 代码:

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

然后出现提示,我可以将参数传递给python脚本:

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

然后我写我的东西,然后退出回到 cmd:

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

我怀疑这部分发生了一些错误,但一百次试验只有一次。所以我想通过一个脚本来做。 我想通过管道将内部 command1 command2 传递给这个脚本,这样我就可以测试这个函数一千次,看看它什么时候坏了。我有以下代码:

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

不幸的是,这不会产生与手动输入相同的行为。 我可以用管道/重定向输出模拟这种行为吗?为什么它不起作用?我希望脚本等待命令时会输入“command1()”文本,但似乎我错了。

谢谢!

编辑 2021 年 2 月 16 日下午 3:33:

  1. 我一直在寻找解决这个问题的 cmd shell 方法,没有 python 的东西
  2. 剧本
echo 'command1()' | py -i /wherever/myscript --username=whoever /some/other/path/parameter

几乎是正确的,只需删除'':

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

我的问题来自 myscript。一旦我修复了这一侧的奇怪东西,这部分就一切正常了。您甚至可以将所有命令放在一起:

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

这个问题改编自 unix.com 上 gplayersv 2012 年 8 月 23 日的一个问题,但最初的目的使这个问题没有得到回答。

【问题讨论】:

    标签: python shell cmd pipe stdin


    【解决方案1】:

    Python 内置的fileinput 模块使这个简单明了:

    #!/usr/bin/env python3
    import fileinput
    
    with fileinput.input() as f:
        for line in f:
            print(line, end='')
    

    你可以接受任何对你来说更容易的机制的输入:

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

    【讨论】:

      【解决方案2】:

      容易有管道。 如果你想获得标准输入:

      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')
      

      如果您想使用标准输入作为参数: echo param | xargs myprogram.py

      【讨论】: