我正在使用子进程模块调用外部程序(plink.exe)来登录服务器; 但是当我呼叫通信来读取输出时,它就是阻塞.代码如下:
import subprocess
process = subprocess.Popen('plink.exe hello@10.120.139.170 -pw 123456'.split(), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print process.communicate() #block here
Run Code Online (Sandbox Code Playgroud)
我知道该块是因为plink.exe它仍在运行; 但我需要在子进程终止之前读取输出.反正有吗?
我试图在python中处理tcpdump输出.
我需要的是运行tcpdump(捕获数据包并给我信息)并读取输出并处理它.
问题是tcpdump一直在运行,我需要在输出后立即读取数据包信息并继续执行.
我试着查看python的子进程并尝试使用popen调用tcpdump并管道stdout但它似乎没有用.
关于如何进行此操作的任何指示.
import subprocess
def redirect():
tcpdump = subprocess.Popen("sudo tcpdump...", stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
while True:
s = tcpdump.stdout.readline()
# do domething with s
redirect()
Run Code Online (Sandbox Code Playgroud) 我正在通过Python的子进程模块运行脚本.目前我使用:
p = subprocess.Popen('/path/to/script', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
result = p.communicate()
Run Code Online (Sandbox Code Playgroud)
然后我将结果打印到stdout.这很好,但由于脚本需要很长时间才能完成,我还希望从脚本到stdout的实时输出.我输出输出的原因是因为我想解析它.
好的,所以我已经看到了十几个这样的线程,但是没有一个给出了完整的答案,我到目前为止所做的一切都不适合我.
1)不断输出一些数据并刷新它的脚本:
import time
import sys
if __name__ == '__main__':
for i in range(5):
print i,
sys.stdout.flush()
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
2)用Popen调用第一个脚本的脚本,应该逐个打印数字但由于某种原因没有,并且一次打印它们:
import sys
import subprocess
if __name__ == '__main__':
process = subprocess.Popen(['python', 'flush.py'], stdout = subprocess.PIPE )
for line in iter(process.stdout.readline, ''):
print line,
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)
我有点困惑的第一件事就是在第一个脚本中,如果你删除了flush它会在一行中返回输出O_O ...我很确定这是因为time.sleep但仍然有点预期它会像一个标准输出不断返回值0,1,2,3,4但不是全部在一起,当然冲洗解决它,但只是奇怪,至少对我来说......
主要问题: 第二个脚本是不是一个一个地返回数字,而是一次性返回一个输出.....我需要的是看到数字逐个弹出...
我读到某个地方,它没有返回EOF,Popen等待关闭管道,这就是为什么它运行到最后......
那我该怎么办或接下来尝试一下呢? 提前致谢.
我需要在子进程生成时读取它的输出 - 可能不会在每个进程上读取write,但是在进程完成之前.我在这里和这里尝试过Python3文档和SO问题的解决方案,但是在孩子终止之前我仍然没有得到任何结果.
该应用程序用于监控深度学习模型的培训.我需要获取测试输出(每次迭代大约250个字节,间隔大约1分钟)并观察统计故障.
stdout.flush()在子进程代码中插入.代码:变体被注释掉了.
亲
cmd = ["/usr/bin/python3", "zzz.py"]
# test_proc = subprocess.Popen(
test_proc = subprocess.run(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT
)
out_data = ""
print(time.time(), "START")
while not "QUIT" in str(out_data):
out_data = test_proc.stdout
# out_data, err_data = test_proc.communicate()
print(time.time(), "MAIN received", out_data)
Run Code Online (Sandbox Code Playgroud)
孩子(zzz.py)
from time import sleep
import sys
for _ in range(5):
print(_, "sleeping", "."*1000)
# sys.stdout.flush()
sleep(1)
print("QUIT this exercise")
Run Code Online (Sandbox Code Playgroud)
尽管发送了1000多个字节的行,缓冲区(在别处测试为2kb;这里,我已经高达50kb)填充不会导致父级"看到"新文本.
为了让这个工作,我错过了什么?
关于链接,评论和iBug发布的答案的更新: …
我无法逐行读取子进程输出.子进程只是将文件的内容与另一个文件进行对比.输出应该是一个两列文件,打印到stdout就好了.但是当我尝试读取每一行时,它会读取每个字符后跟\n:
#!/usr/bin/python
import sys
import getopt
import os
import subprocess
from subprocess import Popen, PIPE, STDOUT
inputfile = ''
target = ''
try:
opts, args = getopt.getopt(sys.argv[1:],"s:t:",['servers=', 'target='])
except getopt.GetoptError:
print 'getopt failure: exit'
sys.exit()
for opt, arg in opts:
if opt in ("-s", "--servers"):
inputfile = arg
if opt in ("-t", "--target"):
boxwin = arg
p1 = subprocess.Popen(["grep -f " + inputfile + " " + target + " | awk '{print $2, $1}'"], stdout=subprocess.PIPE, shell=True)
output, error = …Run Code Online (Sandbox Code Playgroud) 我有一个在命令行上运行良好的命令.它有很多论据cmd --thing foo --stuff bar -a b input output
我想从python运行它并阻塞等待它完成.当脚本打印到的东西stdout,stderr我希望它立即显示给用户.
什么是正确的模块?
我试过了:
import commands
output = commands.getoutput("cmd --thing foo --stuff bar -a b input output")
print output
Run Code Online (Sandbox Code Playgroud)
这项工作很有效,除非stdout直到最后才返回.
import os
os.system("cmd --thing foo --stuff bar -a b input output")
Run Code Online (Sandbox Code Playgroud)
这将在cmd实际完成时打印所有输出.
import subprocess
subprocess.call(["cmd", "--thing foo", "--stuff bar", "-a b", "input", "output"])
Run Code Online (Sandbox Code Playgroud)
这不会以某种方式正确传递参数(我无法找到确切的问题,但cmd拒绝我的输入).如果我把它echo作为第一个参数,它打印出的命令在我直接粘贴到终端时可以正常工作.
import subprocess
subprocess.call("cmd --thing foo --stuff bar -a b input output")
Run Code Online (Sandbox Code Playgroud)
与上面完全相同.
我想用pipe我的文件输出,我popen该怎么做?
test.py:
while True:
print"hello"
Run Code Online (Sandbox Code Playgroud)
a.py :
import os
os.popen('python test.py')
Run Code Online (Sandbox Code Playgroud)
我想使用管道输出os.popen.我怎么能这样做?
我有一个进程,它是这样创建的:
p = subprocess.Popen(args = './myapp',
stdin = subprocess.PIPE,
stdout = subprocess.PIPE,
universal_newlines=True)
Run Code Online (Sandbox Code Playgroud)
后来,我试着写p的stdin:
p.stdin.write('my message\n')
Run Code Online (Sandbox Code Playgroud)
该myapp过程具有以下设置:
q = queue.Queue()
def get_input():
for line in iter(sys.stdin.readline, ''):
q.put(line)
sys.stdin.close()
threading.Thread(name = 'input-getter',
target = get_input).start()
Run Code Online (Sandbox Code Playgroud)
它正在尝试不断读取新行,如下所示:
try:
print('input:', q.get_nowait())
except Empty:
print('no input')
Run Code Online (Sandbox Code Playgroud)
不幸的是,子进程从不接收任何消息.当然,当我使用时:
p.communicate('my message\n')
Run Code Online (Sandbox Code Playgroud)
子进程临危消息,但正如所料,communicate方法关闭p的stdin,所以没有更多的沟通正在进行.
继续我之前的问题,我看到要获取我在python中通过Popen生成的进程的错误代码,我必须调用wait()或communic()(可以用来访问Popen stdout和stderr属性):
app7z = '/path/to/7z.exe'
command = [app7z, 'a', dstFile.temp, "-y", "-r", os.path.join(src.Dir, '*')]
process = Popen(command, stdout=PIPE, startupinfo=startupinfo)
out = process.stdout
regCompressMatch = re.compile('Compressing\s+(.+)').match
regErrMatch = re.compile('Error: (.*)').match
errorLine = []
for line in out:
if len(errorLine) or regErrMatch(line):
errorLine.append(line)
if regCompressMatch(line):
# update a progress bar
result = process.wait() # HERE
if result: # in the hopes that 7z returns 0 for correct execution
dstFile.temp.remove()
raise StateError(_("%s: Compression failed:\n%s") % (dstFile.s,
"\n".join(errorLine)))
Run Code Online (Sandbox Code Playgroud)
然而,文档警告wait() …
python ×9
subprocess ×8
popen ×3
python-3.x ×2
stdout ×2
blocking ×1
nonblocking ×1
pipe ×1
python-2.7 ×1
stdin ×1
tcpdump ×1
unix ×1