我有一个需要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用户,但他们不是专家,而且往往会回避在终端中做事。因此,如果我能给他们一个内置了所有依赖项的应用程序,那将使我的生活和他们的生活更轻松。 :)