相关疑难解决方法(0)

如何在Python中启动后台进程?

我正在尝试将shell脚本移植到更易读的python版本.原始shell脚本在后台使用"&"启动多个进程(实用程序,监视器等).如何在python中实现相同的效果?我希望这些进程不会在python脚本完成时死掉.我确信它与守护进程的概念有某种关系,但我无法轻易找到如何做到这一点.

python daemon process

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

子进程命令的实时输出

我正在使用python脚本作为流体动力学代码的驱动程序.当运行模拟时,我subprocess.Popen用来运行代码,从stdout和stderr收集输出到subprocess.PIPE---然后我可以打印(并保存到日志文件)输出信息,并检查是否有任何错误.问题是,我不知道代码是如何进展的.如果我直接从命令行运行它,它会给我输出关于它在什么时间迭代,什么时间,下一个时间步骤是什么等等的输出.

有没有办法既存储输出(用于记录和错误检查),还产生实时流输出?

我的代码的相关部分:

ret_val = subprocess.Popen( run_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True )
output, errors = ret_val.communicate()
log_file.write(output)
print output
if( ret_val.returncode ):
    print "RUN failed\n\n%s\n\n" % (errors)
    success = False

if( errors ): log_file.write("\n\n%s\n\n" % errors)
Run Code Online (Sandbox Code Playgroud)

最初我正在run_command通过管道,tee以便副本直接进入日志文件,并且流仍然直接输出到终端 - 但这样我就不能存储任何错误(对我的知识).


编辑:

临时解决方案:

ret_val = subprocess.Popen( run_command, stdout=log_file, stderr=subprocess.PIPE, shell=True )
while not ret_val.poll():
    log_file.flush()
Run Code Online (Sandbox Code Playgroud)

然后,在另一个终端,运行tail -f log.txt(st log_file = 'log.txt').

python error-handling shell logging subprocess

165
推荐指数
8
解决办法
13万
查看次数

从subprocess.communicate()读取流输入

我正在使用Python subprocess.communicate()来从一个运行大约一分钟的进程中读取stdout.

如何stdout以流式方式打印出该流程的每一行,以便我可以看到生成的输出,但在继续之前仍然阻止流程终止?

subprocess.communicate() 似乎立刻提供所有输出.

python subprocess

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

使用子进程时如何在Python中复制tee行为?

我正在寻找一种Python解决方案,它允许我将命令的输出保存在文件中,而不会将其从控制台中隐藏.

仅供参考:我问的是tee(作为Unix命令行实用程序)而不是Python intertools模块中具有相同名称的函数.

细节

  • Python解决方案(不调用tee,在Windows下不可用)
  • 我不需要为被调用进程的stdin提供任何输入
  • 我无法控制被叫程序.我所知道的是它会向stdout和stderr输出一些内容并返回退出代码.
  • 在调用外部程序时工作(子进程)
  • 为两者stderr而努力stdout
  • 能够区分stdout和stderr,因为我可能只想显示一个控制台,或者我可以尝试使用不同的颜色输出stderr - 这意味着stderr = subprocess.STDOUT不起作用.
  • 实时输出(渐进式) - 该过程可以运行很长时间,我无法等待它完成.
  • Python 3兼容代码(重要)

参考

以下是我发现的一些不完整的解决方案:

图http://blog.i18n.ro/wp-content/uploads/2010/06/Drawing_tee_py.png

当前代码(第二次尝试)

#!/usr/bin/python
from __future__ import print_function

import sys, os, time, subprocess, io, threading
cmd = "python -E test_output.py"

from threading import Thread
class StreamThread ( Thread ):
    def __init__(self, buffer):
        Thread.__init__(self)
        self.buffer = buffer
    def run ( self ):
        while 1:
            line = self.buffer.readline()
            print(line,end="") …
Run Code Online (Sandbox Code Playgroud)

python subprocess stdout stderr tee

64
推荐指数
4
解决办法
2万
查看次数

Python子进程readlines()挂起

我尝试完成的任务是流式传输ruby文件并打印出输出.(注意:我不想一次打印出所有内容)

main.py

from subprocess import Popen, PIPE, STDOUT

import pty
import os

file_path = '/Users/luciano/Desktop/ruby_sleep.rb'

command = ' '.join(["ruby", file_path])

master, slave = pty.openpty()
proc = Popen(command, bufsize=0, shell=True, stdout=slave, stderr=slave, close_fds=True)     
stdout = os.fdopen(master, 'r', 0)

while proc.poll() is None:
    data = stdout.readline()
    if data != "":
        print(data)
    else:
        break

print("This is never reached!")
Run Code Online (Sandbox Code Playgroud)

ruby_sleep.rb

puts "hello"

sleep 2

puts "goodbye!"
Run Code Online (Sandbox Code Playgroud)

问题

流文件工作正常.hello/goodbye输出以2秒延迟打印.正如脚本应该工作.问题是readline()最后会挂起而永不退出.我从未到过最后一个印刷品.

我知道有很多这样的问题,这里有一个stackoverflow但是没有它们让我解决问题.我不是那个整个子流程的东西,所以请给我一个更实际/具体的答案.

问候

编辑

修复意外的代码.(与实际错误无关)

python subprocess

23
推荐指数
2
解决办法
2万
查看次数

Python子进程将子输出到文件和终端?

我正在运行一个脚本,通过使用执行许多可执行文件

subprocess.call(cmdArgs,stdout=outf, stderr=errf)
Run Code Online (Sandbox Code Playgroud)

when outf/ errf是None或文件描述符(stdout/的不同文件stderr).

有什么方法可以执行每个exe,以便将stdout和stderr一起写入文件和终端?

python subprocess parent

16
推荐指数
1
解决办法
6764
查看次数

让子进程输出到文件和 stdout/stderr 的最简单接口?

我想要cmd > >(tee -a {{ out.log }}) 2> >(tee -a {{ err.log }} >&2)在 python 子进程中具有类似效果的东西,而不需要调用tee. 基本上将 stdout 写入 stdout 和 out.log 文件,并将 stderr 写入 stderr 和 err.log 文件。我知道我可以使用循环来处理它。但由于我的代码中已经有很多 Popen、subprocess.run 调用,而且我不想重写整个事情,我想知道是否有某个包提供的更简单的接口可以让我做类似的事情:

subprocess.run(["ls", "-l"], stdout=some_magic_file_object(sys.stdout, 'out.log'), stderr=some_magic_file_object(sys.stderr, 'out.log') )
Run Code Online (Sandbox Code Playgroud)

python subprocess

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

使 Python 记录器记录所有 stdout 和 stderr 消息

使用 python logging 包,并编写一个类 Log,我想将 stdout 和 stderr 发送到日志文件:

log = Log("log.txt")
print "line1"
print "line2"
print >>sys.stderr, "err1"
del log
print "line to screen only"
Run Code Online (Sandbox Code Playgroud)

输出日志文件将包含:

16/11/2017 09:51:58 INFO - line1
16/11/2017 09:51:58 INFO - line2
16/11/2017 09:51:58 INFO - err1
Run Code Online (Sandbox Code Playgroud)

知道如何编写这个 Log 类,保持“日志”包(时间戳,...)的优势吗?

python logging stdout tee

2
推荐指数
1
解决办法
6773
查看次数

标签 统计

python ×8

subprocess ×6

logging ×2

stdout ×2

tee ×2

daemon ×1

error-handling ×1

parent ×1

process ×1

shell ×1

stderr ×1