在后台运行python文件时没有输出

时间:2017-03-26 06:24:36

标签: python linux stdout

我在python中编写了一个使用以下代码的程序:

for item in items:
       sys.stdout.write("".join(str(i) for i in item))
       sys.stdout.write(self.separator)
       sys.stdout.flush()

打印输出。

当我通过终端正常运行时:

vm@ubuntu:~$ ./program.py

效果很好。

当我运行它并将stdout发送到文件时:

vm@ubuntu:~$ ./program.py > file

但是当我尝试在后台运行它时:

vm@ubuntu:~$ ./program.py > file &

它没有用输出填充文件。

有人知道如何解决它吗?

3 个答案:

答案 0 :(得分:0)

尝试运行

./program.py > file &

而不是

./program.py > file $

答案 1 :(得分:0)

我通过删除等待KeyboardInterrupt package main import ( "fmt" "golang.org/x/net/html" "strings" ) func main() { s := "html" result := make(map[string]string) d := html.NewTokenizer(strings.NewReader(s)) currID := "" for { tokenType := d.Next() if tokenType == html.ErrorToken { break } token := d.Token() switch tokenType { case html.StartTagToken: if token.Data == "select" { for _, a := range token.Attr { if a.Key == "id" { currID = a.Val } } } if token.Data == "option" { isSelected := false for _, a := range token.Attr { if a.Key == "selected" { isSelected = true } } if isSelected { for _, a := range token.Attr { if a.Key == "value" { result[currID] = a.Val } } } } } } fmt.Printf("%v\n", result) } 的行来解决它 并用无尽的循环代替它。

第一个问题是为了更好地理解:为什么这一行导致进程在后台运行时不能正确传递stdout? 在fg中运行时不会出现此问题。

现在,我需要通过终止进程来杀死它

raw_input()

第二个问题:如何在不使用阻塞和等待函数raw_input()的情况下通过缓冲区检查键击(就像在C中检查一样)?

答案 2 :(得分:0)

整个解决方案:

  1. 将stdin重定向到空文件
  2. 将以下代码添加到正在运行的程序中:

    而(真):     尝试:         一个的raw_input =()         对于ai:             如果ai ==“q”:                 tb.stop()                 tb.wait()

  3. 使用以下命令运行程序

    ./ program.py< fileSTDIN&

  4. 为了终止正在运行的bg进程,我只需要在文件中写'q'

    echo“q”> fileSTDIN