在 Python 中使用 os.popen 时出现 Dpkg 管道损坏错误

在 Python 中使用 os.popen 时出现 Dpkg 管道损坏错误

我正在尝试使用 Gtk+ 3,并创建一个程序,该程序获取dpkg --get-selections命令的输出并将其显示到 Gtk+ 3 中TextView

当我运行我的程序时出现以下错误:

Traceback (most recent call last):
  File "file1.py", line 36, in <module>
    window = dpkgApp()
  File "file1.py", line 24, in __init__
    with open("", "w") as f:
IOError: [Errno 2] No such file or directory: ''
dpkg: error: error writing to '<standard output>': Broken pipe

这是我的代码:

#!/usr/bin/python

import io, subprocess, os
from gi.repository import Gtk

class dpkgApp(Gtk.Window):
    def __init__(self):

        Gtk.Window.__init__(self, title="Software/dependencies")

        self.table = Gtk.Table(3, 3, True)
        self.add(self.table)

        self.scrollWindow = Gtk.ScrolledWindow()
        self.table.attach(self.scrollWindow, 0, 1, 0, 1)

        self.textView = Gtk.TextView()
        self.scrollWindow.add(self.textView)

#######################################################################
        subprocess.call("dpkg --get-selections", shell=True)
        dpkg_output = os.popen("dpkg --get-selections")

        with open("", "w") as f:
            f.writeline(dpkg_output)
            f.close()

        buffer = Gtk.TextBuffer()
        self.textView.get_buffer(buffer)
        self.textView.set_editable(False)
        self.textView.set_wrap_mode(True)
        self.textView.set_cursor_visible(False)

        buffer.set_text(dpkg_output)

window = dpkgApp()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()

在 StackOverflow 上查看,这似乎是一个问题subprocess ,但我正在使用os模块来获取dpkg命令输出 - 并且错误输出包括dpkg: error:,所以也许这是一个dpkg错误?

我尝试用以下行替换并添加该os.popen行,但收到​​错误:os.Popen(["dpkg --get-selections"], stdout=PIPE)from subprocess import Popen, PIPE

AttributeError: 'module' object has no attribute 'Popen'

有任何想法吗?

答案1

调用dpkg --get-selections正常;问题出在下面的第 24 行,当您尝试打开一个文件名为空的文件时:

with open("", "w") as f:

不允许使用空文件名。使用“真实”文件名,或者如果您不想关心名称和位置,则使用临时文件:

import tempfile
with tempfile.TemporaryFile() as f:

此外,file没有writeline您可能正在寻找的功能writelines

f.writelines(dpkg_output)

相关内容