相关疑难解决方法(0)

如何使用子进程模块与进程正确交互

我在使用子进程模块重定向另一个程序的stdio时遇到问题.只是从stdout读取导致挂起,并且Popen.communicate()可以工作,但它在读/写后关闭管道.实现这个最简单的方法是什么?

我在Windows上玩这个:

import subprocess
proc = subprocess.Popen('python -c "while True: print \'Hi %s!\' % raw_input()"',
                        shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
                        stderr=subprocess.STDOUT)
while True:
    proc.stdin.write('world\n')
    proc_read = proc.stdout.readline()
    if proc_read:
        print proc_read
Run Code Online (Sandbox Code Playgroud)

python subprocess

11
推荐指数
1
解决办法
1万
查看次数

在 python 中将输出捕获为 tty

我有一个需要 tty (如 stdin 和 stderr)的可执行文件,并且希望能够测试它。我想输入 stdin,并捕获 stdout 和 stderr 的输出,这是一个示例脚本:

# test.py
import sys
print("stdin: {}".format(sys.stdin.isatty()))
print("stdout: {}".format(sys.stdout.isatty()))
print("stderr: {}".format(sys.stderr.isatty()))
sys.stdout.flush()
line = sys.stdin.readline()
sys.stderr.write("read from stdin: {}".format(line))
sys.stderr.flush()
Run Code Online (Sandbox Code Playgroud)

我可以在没有 tty 的情况下运行它,但是它会被捕获.isatty并且每个都返回 False:

import subprocess
p = subprocess.Popen(["python", "test.py"], stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
p.stdin.write(b"abc\n")
print(p.communicate())
# (b'stdin: False\nstdout: False\nstderr: False\n', b'read from stdin: abc\n')
Run Code Online (Sandbox Code Playgroud)

我想捕获 stdout 和 stderr 并让所有三个返回 True - 作为 tty。

我可以用来pty制作 tty 标准输入:

import subprocess
m, s = pty.openpty()
p = subprocess.Popen(["python", "test.py"], …
Run Code Online (Sandbox Code Playgroud)

python subprocess popen tty

10
推荐指数
1
解决办法
4553
查看次数

在运行时获取进程的输出

我正在使用python脚本运行进程subprocess.Popen,同时将输出存储在文本文件中,并在控制台上打印.这是我的代码:

result = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
for line in result.stdout.readlines(): #read and store result in log file
    openfile.write("%s\n" %line)
    print("%s" %line)
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常,但它的作用是首先完成该过程并将输出存储在结果变量中.之后for循环存储输出并打印它.

但我希望在运行时输出(因为我的过程可能需要数小时才能完成,所有这些时间都没有得到任何输出).

那么有没有任何其他函数可以动态地(在运行时)给我输出,意味着只要进程给出第一行,就应该打印出来.

python subprocess python-3.x

9
推荐指数
1
解决办法
1万
查看次数

Python 3.4.3 subprocess.Popen获取命令输出而不管道?

我试图将命令的输出分配给变量,而不会让命令认为它正在被管道传输.这样做的原因是,如果正在通过管道传输,有问题的命令会将未格式化的文本作为输出,但如果从终端运行,则会给出颜色格式化的文本.我需要得到这种颜色格式的文本.

到目前为止,我已经尝试了一些事情.我这样试过Popen:

output = subprocess.Popen(command, stdout=subprocess.PIPE)
output = output.communicate()[0]
output = output.decode()
print(output)
Run Code Online (Sandbox Code Playgroud)

这将让我打印输出,但它给我输出管道命令时得到的无格式输出.这是有道理的,因为我在Python代码中管它.但我很好奇是否有办法将此命令的输出直接分配给变量,而没有运行自身管道版本的命令.

我还尝试了以下依赖于check_output的版本:

output = subprocess.check_output(command)
output = output.decode()
print(output)
Run Code Online (Sandbox Code Playgroud)

而且,当命令通过管道输出时,我得到了与命令返回的相同的无格式输出.

有没有办法获得格式化输出,命令通常从终端提供的输出,当它没有被管道?

python linux bash subprocess popen

7
推荐指数
1
解决办法
1万
查看次数

Jupyter 笔记本中 shell 命令的实时输出

我告诉 jupyter 执行一个 python 脚本:

!python build_database.py
Run Code Online (Sandbox Code Playgroud)

从终端执行时,python 脚本会打印执行过程中的进度。但是,在 jupyter notebook 中,我在执行后将所有输出打印为字符串列表。有没有办法实时查看输出?

python jupyter-notebook

7
推荐指数
1
解决办法
3226
查看次数

捕获输出时,使用带有select和pty的子进程挂起

我正在尝试编写一个能够与其他程序交互的python程序.这意味着发送stdin并接收stdout数据.我不能使用pexpect(尽管它确实激发了一些设计).我现在正在使用的过程是这样的:

  1. 将pty附加到子进程的stdout
  2. 循环直到子进程通过检查退出 subprocess.poll
    • 当stdout中有可用数据时,该数据立即写入当前标准输出.
  3. 完!

我一直在制作一些代码(下面)的原型,但它似乎有一个瑕疵让我烦恼.子进程完成后,如果我在使用时未指定超时,则父进程将挂起select.select.我真的不想设置超时.它看起来有点脏.但是,我尝试解决这个问题的所有其他方法似乎都不起作用.Pexpect似乎通过使用os.execvpty.fork不是subprocess.Popenpty.openpty我不喜欢的解决方案来绕过它.我是如何检查子流程的生命周期的?我的方法不正确吗?

我正在使用的代码如下.我在Mac OS X 10.6.8上使用它,但我也需要它在Ubuntu 12.04上工作.

这是子进程运行程序runner.py:

import subprocess
import select
import pty
import os
import sys

def main():
    master, slave = pty.openpty()

    process = subprocess.Popen(['python', 'outputter.py'], 
            stdin=subprocess.PIPE, 
            stdout=slave, stderr=slave, close_fds=True)

    while process.poll() is None:
        # Just FYI timeout is the last argument to select.select
        rlist, wlist, xlist = select.select([master], [], [])
        for f in rlist:
            output = os.read(f, 1000) # This …
Run Code Online (Sandbox Code Playgroud)

python select subprocess pty

6
推荐指数
2
解决办法
7359
查看次数

python子进程通信冻结

我有以下挂起的python代码:

cmd = ["ssh", "-tt", "-vvv"] + self.common_args
cmd += [self.host]
cmd += ["cat > %s" % (out_path)]
p = subprocess.Popen(cmd, stdin=subprocess.PIPE,
                         stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate(in_string)
Run Code Online (Sandbox Code Playgroud)

它应该通过ssh将字符串(in_string)保存到远程文件中.

文件已正确保存,但随后进程挂起.如果我使用

cmd += ["echo"] instead of
cmd += ["cat > %s" % (out_path)]
Run Code Online (Sandbox Code Playgroud)

这个过程没有挂起所以我很确定我误解了沟通认为流程退出的方式.

你知道怎么写这个命令所以"cat>文件"不能让沟通挂起吗?

python subprocess

6
推荐指数
1
解决办法
3325
查看次数

使用Popen获取输出彩色文本

我正在使用popen制作一个插件,这个插件使用了一个外部程序,在输出中显示了一些彩色文本.

输出是这样的:

avr-g++ -o .pioenvs\uno\FrameworkArduino\HardwareSerial.o -c -std=gnu++11 -fno-exceptions -fno-threadsafe-statics -g -Os -Wall -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO_ARCH_AVR -DARDUINO_AVR_UNO -DARDUINO=10607 -I.pioenvs\uno\FrameworkArduino -I.pioenvs\uno\FrameworkArduinoVariant .pioenvs\uno\FrameworkArduino\HardwareSerial.cpp    
avr-g++ -o .pioenvs\uno\FrameworkArduino\HardwareSerial0.o -c -std=gnu++11 -fno-exceptions -fno-threadsafe-statics -g -Os -Wall -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO_ARCH_AVR -DARDUINO_AVR_UNO -DARDUINO=10607 -I.pioenvs\uno\FrameworkArduino -I.pioenvs\uno\FrameworkArduinoVariant .pioenvs\uno\FrameworkArduino\HardwareSerial0.cpp
=============================================
Path\file.cpp: in function 'void loop()':
Path\file.cpp:23:2 error: expected ';' before '}' token
}
^
=============================================
Run Code Online (Sandbox Code Playgroud)

所有内部"="都是红色和黄色.

当我在命令控制台中运行命令时,我可以看到完整的输出,但是当我使用Popen时,我只能获得未着色的文本

这就是我使用Popen的方式

process = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, cwd=self.cwd, universal_newlines=True, shell=True)
output = process.communicate()

stdout = output[0]
stderr = output[1]

print(stdout)
print(stderr) …
Run Code Online (Sandbox Code Playgroud)

python popen python-2.7 output

6
推荐指数
1
解决办法
3389
查看次数

Python没有从subprocess.check_call获取原始二进制文件

如何让subprocess.check_call给我一个命令的原始二进制输出,它似乎在某处错误地编码.

细节:

我有一个返回如下文本的命令:

some output text “quote” ...
Run Code Online (Sandbox Code Playgroud)

(那些报价是unicode e2809d)

这是我如何调用命令:

f_output = SpooledTemporaryFile()
subprocess.check_call(cmd, shell=True, stdout=f_output)
f_output.seek(0)
output = f_output.read()
Run Code Online (Sandbox Code Playgroud)

问题是我明白了:

>>> repr(output)
some output text ?quote? ...
>>> type(output)
<str>
Run Code Online (Sandbox Code Playgroud)

(如果我把'ord'称为'?'我得到63.)我在Linux上使用Python 2.7.

注意:在OSX上运行相同的代码对我来说是正确的.问题是我在Linux服务器上运行它.

python unicode subprocess python-2.7

6
推荐指数
1
解决办法
696
查看次数

记录 python 子进程的语法错误和未捕获的异常并将其打印到终端

问题

我一直在尝试编写一个程序来记录子进程的未捕获异常和语法错误。容易,对吧?只需将管道输送stderr到正确的位置即可。

然而,子进程是另一个 python 程序——我称之为test.py——需要运行,就好像它的输出/错误没有被捕获一样。也就是说,运行记录器程序需要看起来就像用户刚刚python test.py正常运行一样。

使问题进一步复杂化的是如果不使用则实际发送到的问题不幸的是,我不能,因为我无法控制使用错误记录器运行的文件。raw_inputstderrreadlineimport readline

笔记:

  • 我对运行这段代码的机器有相当的限制。我无法安装pexpect或编辑这些*customize.py文件(因为该程序将由许多不同的用户运行)。我真的觉得无论如何应该有一个 stdlib 解决方案......
  • 这仅适用于 Macs。
  • 这样做的动机是我是研究新程序员所犯错误的团队的一员。

我尝试过的

我尝试过以下方法,但没有成功:

  • 只是使用tee问题中的如何在使用带有管道的“tee”时将 stderr 写入文件?(未能产生raw_input提示);我在几个 SO 问题中发现的python 实现也tee有类似的问题
  • 覆盖sys.excepthook(无法使其适用于子进程)
  • 这个问题的最佳答案似乎很有希望,但它未能raw_input正确显示提示。
  • 日志记录模块似乎对于实际写入日志文件很有用,但似乎没有解决问题的关键
  • 自定义 stderr 阅读器
  • 无休止的谷歌搜索

python subprocess stderr

5
推荐指数
1
解决办法
2452
查看次数