Python:使用subprocess.Popen.communicate将密码传递给sudo时出现Unicode错误

时间:2018-04-24 02:04:30

标签: python subprocess sudo popen communicate

我有一个需要sudo权限的tkinter Python 3程序,所以它会检查它,如果你没有,它会询问你的密码,然后用sudo重新运行程序。

当前代码只运行python3 myscript.py之类的代码时有效,但是如果我用python3 -m py_compile编译脚本并运行它会给我以下错误。

Traceback (most recent call last):
  File "myscript.py", line 339, in <module>
    prompt = reload.communicate(input='{}\r\n'.format(password))[1]
  File "/usr/lib/python3.5/subprocess.py", line 1072, in communicate
    stdout, stderr = self._communicate(input, endtime, timeout)
  File "/usr/lib/python3.5/subprocess.py", line 1757, in _communicate
    self.stderr.encoding)
  File "/usr/lib/python3.5/subprocess.py", line 976, in _translate_newlines
    data = data.decode(encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9d in position 259: 
invalid start byte

同样,这只发生在编译脚本之后,似乎与subprocess.Popen中的翻译换行选项有关。

这里有一些麻烦的代码:

def get_userpassword():
    userpassword = simpledialog.askstring("Password",  "Please enter your password:",  show='*')
    return userpassword

password = get_userpassword()
reload = subprocess.Popen(['sudo', '-k',  '-S',  './' + __file__],
                          stdin=subprocess.PIPE,
                          stderr=subprocess.PIPE,
                          universal_newlines=True)
prompt = reload.communicate(input='{}\r\n'.format(password))[1]

我确定我错过了一些东西,因为我已经使用StackExchange中发现的其他代码将所有这些放在一起,但似乎没有人像这样做(编译它) )。或者我应该忘记它并给用户一个警告,用sudo重新运行脚本?

还有一点背景,我试图用PyInstaller冻结这段代码,发现编译过程停止工作。此外,我正在为一些Linux用户写这篇文章,他们虽然是Linux用户,但他们不是专家,而且往往会回避在终端中做事。因此,如果我能给他们一个内置了所有依赖项的应用程序,那将使我的生活和他们的生活更轻松。 :)

0 个答案:

没有答案