سؤال

أنا أعمل على تطوير واجهة المستخدم الرسومية لإعادة تجميع kernel Linux. لهذا ، أحتاج إلى تنفيذ أوامر Linux 4-5 من Python. يمكنني استخدام QT كمصمم واجهة المستخدم الرسومية. لقد نجحت في تطبيق الأوامر باستخدام os.system() مكالمة. ولكن يتم الحصول على الإخراج في وحدة التحكم. المشكلة الحقيقية هي إخراج الأوامر هو القائمة التي تستغرق الطباعة المستمرة ما يقرب من 20 إلى 25 دقيقة. كيف يمكننا نقل إخراج وحدة التحكم هذا إلى مربع نص مصمم في QT. هل يمكن لأي شخص أن يساعدني في تنفيذ setSource() التشغيل في QT باستخدام المصدر عند مخرجات وحدة التحكم المباشرة.

هل كانت مفيدة؟

المحلول

self.process = QProcess()
self.connect(self.process, SIGNAL("readyReadStdout()"), self.readOutput)
self.connect(self.process, SIGNAL("readyReadStderr()"), self.readErrors)
tarsourcepath="sudo tar xvpf "+ self.path1
self.process.setArguments(QStringList.split(" ",tarsourcepath))
self.process.start()



def readOutput(self):

    self.textBrowser2.append(QString(self.process.readStdout()))
    if self.process.isRunning()==False:
        self.textBrowser2.append("\n Completed Successfully")




def readErrors(self):
    self.textBrowser2.append("error: " + QString(self.process.readLineStderr()))

هذا فعل العمل جيد جدا بالنسبة لي. شكرا لكم جميعا.

نصائح أخرى

أنا أتعامل في الغالب مع Wxpython ، لكن IS http://diotavelli.net/pyqtwiki/capturing_output_from_a_process حل من شأنه أن يعمل؟

من الصفحة:

مشكلة: تريد تشغيل عملية تطبع الكثير من المعلومات إلى وحدة التحكم وعرض الإخراج في محرر نصية أو متصفح ، ولكن النتيجة هي واجهة مستخدمية تتجمد حتى يتم الانتهاء من العملية.

الحل (واحد من العديد من الممكنات):قم بإنشاء كائن QPROCESS ، وقم بتوصيل إشاراته ببعض الفتحات في فصلك ، وقم بتمرير الوسيطات المطلوبة وبدء تشغيلها. يتم تسليم البيانات عن stdout للعملية و STDERR إلى فتحاتك.

واصلت...

استخدام أنبوب يتبادر إلى الذهن. يمكنك استخدام موضوع خلفية يقرأ إخراج البرنامج (ويرسل الأحداث إلى واجهة المستخدم الرسومية كلما تمت إضافة خط جديد).

لذا فإن الفكرة الأساسية هي:

os.chdir("/usr/src/linux-2.6.34")

p = os.popen("make", "r")
try:
    while True:
        line = p.readline()
        if not line:
            break

        # Replace this with a GUI update event (don't know anything about Qt, sorry)
        print line
finally:
    # Cf. http://docs.python.org/library/os.html#os.popen
    programReturnValue = p.close() or 0
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top