Я пытаюсь запустить sudo в python, чтобы открыть приложение

Например, если я хотел вызвать synaptic в моем скрипте на python, это то, что я пытался, но я получаю ошибку с Popen. Есть ли способ заставить эту работу работать с sudo вместо gksu? Я хотел бы использовать этот метод для запуска скриптов в более крупной программе.

process = subprocess.Popen("sudo synaptic", 'w', stdout=subprocess.PIPE, bufsize=1).write(password)
TypeError: __init__() got multiple values for keyword argument 'bufsize'

Ниже то, с чем я работаю

from PyQt4 import QtGui, QtCore
import os
import sys
import subprocess
# from mainwindow import Ui_MainWindow

class PasswordDialog(QtGui.QDialog):
    def __init__(self, parent=None):
        super(PasswordDialog, self).__init__(parent)
        PasswordDialog.resize(self, 375, 130)
        PasswordDialog.setWindowTitle(self, "Enter Password")
        self.buttonOk = QtGui.QPushButton(self)
        self.buttonOk.setText("OK")
        self.buttonCancel = QtGui.QPushButton(self)
        self.buttonCancel.setText("Cancel")
        self.textEdit = QtGui.QLineEdit(self)
        self.textEdit.setFocus()

        self.label = QtGui.QLabel(self)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setText("Enter your password to perform administrative Tasks")
        self.label.setWordWrap(True)
        self.label_2 = QtGui.QLabel(self)
        self.label_2.setText("Password")
        self.verticalLayout = QtGui.QVBoxLayout(self)
        self.verticalLayout.addWidget(self.label)
        self.horizontalLayout = QtGui.QHBoxLayout(self)
        self.horizontalLayout.addWidget(self.label_2)
        self.horizontalLayout.addWidget(self.textEdit)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.horizontalLayout2 = QtGui.QHBoxLayout(self)
        self.horizontalLayout2.setAlignment(QtCore.Qt.AlignRight)
        self.horizontalLayout2.addWidget(self.buttonCancel)
        self.horizontalLayout2.addWidget(self.buttonOk)
        self.verticalLayout.addLayout(self.horizontalLayout2)
        self.buttonOk.clicked.connect(self.handleLogin)
        self.buttonCancel.clicked.connect(self.close)

    def handleLogin(self):
        password = self.textEdit.text()
        process = subprocess.Popen("sudo synaptic", 'w').write(password)
        #out = process.stdout.read(1)
        try:
            subprocess.check_call(process)
        except subprocess.CalledProcessError as error:
            print "error code", error.returncode, error.output



if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    login = PasswordDialog()

    if login.exec_() == QtGui.QDialog.Accepted:
        window = Window()
        window.show()
        sys.exit(app.exec_())

2 ответа

Решение

Я думаю, что вы должны использовать communicate отправить пароль sudo команда.

Попробуй это:

import subprocess

with subprocess.Popen(["sudo", "synaptic"], stdout=subprocess.PIPE, bufsize=1) as process:
    process.communicate(password)
    process.wait()

Значение process должна быть строка байтов...

Вы передаете неправильные аргументы Popen, Документы находятся здесь: https://docs.python.org/3/library/subprocess.html

или даже проще... просто используйте call функция, предоставляемая subprocess модуль:

subprocess.call(['sudo', 'synaptic'])
Другие вопросы по тегам