我试图在python中发出命令并读取输入并将其解析回去。 这是我要发出的命令(例如在命令行上运行时的示例)

-bash-3.2$ echo "passthru TST,1234" | ./vsh -a 127.0.0.1 -p 7000
PASSTHRU TST,1234
udp_send_command: timed out waiting for response
-bash-3.2$

我正在尝试使用python子进程

            vsh_command = ' "passthru ' + cmd + '" | ./vsh -a ' + ip_address + ' -p ' + port
            print vsh_command
            new_command = ['echo', vsh_command]
            print new_command
            proc = subprocess.Popen(new_command,
                    stdout=subprocess.PIPE,
                    stderr=subprocess.PIPE,
                    stdin=subprocess.PIPE,
                    shell=True)
            print '1'
            out_2, err = proc.communicate()
            print out_2
            print '2'
            rcv = out_2.splitlines()
            print '3'
            for r in rcv:
                    print '     ' + r
            print '4'

`

 "passthru TST,1234" | ./vsh -a 127.0.0.1 -p 7000
['echo', ' "passthru TST,1234" | ./vsh -a 127.0.0.1 -p 7000']
1


2
3

4

是一个| 子进程无法使用命令? 如果是这样,还有另一种方法可以运行此shell命令并获取输入吗?

更新:(使用单个字符串表示shell = true命令)

`vsh_command = 'echo "passthru ' + cmd + '" | ./vsh -a ' + ip_address + ' -p ' + port
            print vsh_command
            proc = subprocess.Popen(vsh_command,
                    stdout=subprocess.PIPE,
                    stderr=subprocess.PIPE,
                    stdin=subprocess.PIPE,
                    shell=True)
            print '1'
            out_2, err = proc.communicate()
            print out_2
            print '2'
            rcv = out_2.splitlines()
            print '3'
            for r in rcv:
                    print '     ' + r
            print '4'

`

运行(Python脚本)

echo "passthru TST,1234" | ./vsh -a 127.0.0.1 -p 7000
1
PASSTHRU TST,1234

2
3
     PASSTHRU TST,1234
4
SUCCESS

仍然不是我正在寻找的东西,看起来它只是在执行echo命令而不是管道

编辑#2

            p = Popen(["./vsh", "-a", ip_address, "-p", str(port)],stdin=PIPE, stdout=PIPE)
            out, err =  p.communicate("passthru TST,1234")
            print '----------'
            print out

输出:

-bash-3.2$ python mfd_ascii_test.py
udp_send_command: timed out waiting for response
----------
PASSTHRU TST,1234

-bash-3.2$

out是回声的结果,而不是“ udp_send_command:超时等待响应”

===============>>#1 票数:2

如果要将输出从一个管道传递到另一个,则可以将标准输出从一个进程传递到另一个进程的标准输入:

from subprocess import PIPE,Popen

p1 = Popen(["echo", "passthru TST,1234"],stdout=PIPE)

p2 = Popen(["./vsh", "-a", "127.0.0.1", "-p", "7000"],stdin=p1.stdout,stdout=PIPE,stderr=PIPE)
p1.stdout.close()
out, err = p2.communicate()

如果要使用竖线字符,则需要设置shell = True并传递单个字符串:

from subprocess import check_output

out = check_output('echo "passthru TST,1234" | ./vsh -a 127.0.0.1 -p 7000',shell=True)

===============>>#2 票数:1 已采纳

要将字符串作为输入传递给子流程并捕获其输出,可以使用Popen.communicate()方法

#!/usr/bin/env python2
from subprocess import Popen, PIPE, STDOUT

p = Popen(["./vsh", "-a", ip_address, "-p", str(port)],
          stdin=PIPE, stdout=PIPE, stderr=STDOUT)
output = p.communicate("passthru " + cmd)[0]

stderr=STDOUT将stderr合并到stdout中。

设置stdout=PIPE捕获stdout,设置stderr=PIPE捕获stderr; 否则, communicate()对于相应的管道返回None 如果该进程可能在stdout之外写,则stderr然后使用pexpectpty + select模块 这是pexpect.runu()pty.spawn()代码示例

===============>>#3 票数:-1

如果将shell=True设置shell=True则可以直接将字符串命令与subprocess.check_output一起使用(使用python 2.7)。

output = subprocess.check_output(" ".join(new_command), shell=True)

或者,您可以使用subprocess.Popen (python <2.7)。

output, err = subprocess.Popen(" ".join(new_command), stdout=subprocess.PIPE, shell=True).communicate()

  ask by georges translate from so

未解决问题?本站智能推荐:

1回复

当标准输入为默认值时,Python通讯和subprocess.popen挂在读取标准输入上

我有一个python守护进程。 每次调用命令时,此守护进程都会产生一个线程来满足对守护程序的调用。 在线程中,我使用Python子进程popen执行此类shell命令,例如 在执行某些命令期间,proc.communicate()永不返回。 当我检查父守护程序的strace时,在其
2回复

即使Popen仍在运行,python子进程poll()也不返回None

我有一个使用while循环和睡眠的python脚本,它执行超时的linux命令,如下所示 我的问题是在上述情况下,即使超时为5秒,猫仍会继续操作直至完成。 我在这里想念什么吗? 请帮忙。
3回复

Popen子进程Python

我正在使用Popen进行远程调用脚本 stdout = s.communicate() 打印标准输出 该脚本不会以shell脚本中提到的状态退出,而是仅显示成功或失败状态。 我想根据外壳脚本退出状态代码。 这是shell脚本 如何获得状态码返回?
1回复

子进程,Popen Python

我想运行一个程序,比如MATLAB或其他来自Python的FEA软件,等待它运行并存储结果,然后再用Python进行处理。 我无法找到一个关于如何这样做的真正基本的例子。 一个简单的代码或任何有用的链接将受到高度赞赏。 Subprocess模块​​的帮助看起来有点复杂。
1回复

Python子进程.Popen通过管道进行通信

我希望能够使用Popen.communicate并将stdout记录到文件中(除了从communicate()返回的以外communicate() 。 这就是我想要的-但这真的是个好主意吗? 与此相关的任何问题,看一下沟通的暗示,看起来都不错。 但是有更好的方法吗?
1回复

Python中的子进程Popen和PIPE

以下代码将空行打印为输出,为false。 问题不在于权限,因为我使用777权限测试了pdf -file的命令。 如何修复命令以提供正确的输出?
8回复

具有修改后环境的Python子进程/ Popen

我相信在环境稍有修改的情况下运行外部命令是很常见的情况。 这就是我倾向于这样做的方式: 我感觉到有更好的办法了。 看起来还好吗?
2回复

Python子进程.Popen不起作用

我一直在阅读许多文档,但仍不确定我在做什么错。 因此,我有一个单独的Shell脚本,它会启动一个单独的服务器,然后启动我正在处理的服务器。 连接服务器后,我要运行ls就是这样。 但是,由于某种原因,stdin = subprocess.PIPE阻止了Popen命令的终止,以便可以执行下
2回复

在Python中终止启动的Popen子进程

我在Windows上,正在使用subprocess.Popen启动一个新进程,该进程要在某个点终止。 但是,我启动的gui仍然可见。 一个最小的示例是启动PNG查看器: 在执行kill()命令后,gui仍在运行,我必须手动将其关闭。 作为FAS,我理解这一点可以在Linux上通
1回复

Python子进程Popen没有向shell发送所有参数

我正在使用Python的子进程模块来启动另一个程序。 该程序需要一个参数'-c {0-7}'。 在C ++程序中,我正在检查传入的参数: 这是我运行python脚本时的输出: 很明显,参数'-c3'没有传递给子进程。 有什么想法吗?