Android 在python 3.4中对字符串进行编码

Android 在python 3.4中对字符串进行编码,android,python-3.x,buffer,root,Android,Python 3.x,Buffer,Root,在Python3.4中运行此脚本时出现此错误 Traceback (most recent call last): File "qcdlcomm.py", line 23, in <module> if not call('whoami')[0] == 'root': File "qcdlcomm.py", line 20, in call return subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE).stdout.r

在Python3.4中运行此脚本时出现此错误

Traceback (most recent call last):
File "qcdlcomm.py", line 23, in <module>
if not call('whoami')[0] == 'root':
File "qcdlcomm.py", line 20, in call
return  subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE).stdout.read().strip().split("\n")
TypeError: 'str' does not support the buffer interface
回溯(最近一次呼叫最后一次):
文件“qcdlcomm.py”,第23行,在
如果不调用('whoami')[0]=='root':
调用文件“qcdlcomm.py”,第20行
返回subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE).stdout.read().strip().split(“\n”)
TypeError:“str”不支持缓冲区接口
我想答案就在这里,但我不知道如何实现它


在python3中,字符串的处理方式不同。字符串与字节不同。调用
whoami
得到的是一个字节数组。要修复
调用
函数,只需将字节解码为字符串:

def call(cmd,hide_stderr=True):                                                 
    return subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE).stdout.read().decode("utf-8").strip().split("\n")
这是中提到的类似问题

请注意,这只是一个快速修复,但适用于您的用例。只需将
.decode('utf-8')
插入
.read()
之间的第20行。strip()

不接受
str
(Python 3中的Unicode类型):

universal\u新行
启用文本模式
check_output()
自动重定向子项的标准输出,并在其非零退出状态下引发异常

注意:
shell=True
在这里是不必要的(您不需要shell来运行
whoami


无关:要了解您是否是Python中的
root
,可以使用:

如果需要:


注意:

通常,如果您想在Python3中对Popen使用文本模式(并且假设您使用的是cPython实现),您可以将
编码
错误
通用新行
参数传递给Popen构造函数。例如:

return subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, universal_newlines=True).stdout.read().strip().split("\n")
这是因为在
Popen
中的
\uuuu init\uuuu
的cPython实现中有一行代码:

text_mode = encoding or errors or universal_newlines
这也是cPython内部执行的
检查\u输出
——它确保
输入
关键字参数(如果存在且
)具有适当的类型,并将关键字参数传递给
运行
(稍后调用
Popen
):


请参阅。

中的详细信息。通常,您不应该硬编码
utf-8
编码。传递
universal\u newlines=True
或使用
locale.getpreferredencoding(False)
编码。感谢您的帮助。这行吗?”
def call(cmd,hide\u stderr=True):返回subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE).stdout.read().decode(“utf-8”).strip().split(“\n”)
\code>如果不调用('whoami',universal\u newlines=True)[0]=“root”:print(“以root身份运行”)sys.exit()
否。第19行定义的
调用
函数没有
通用新行
参数。只需将第19-20行中的函数定义替换为我提供的快速修复版本即可。
#!/usr/bin/env python
from subprocess import check_output

username = check_output(['whoami'], universal_newlines=True).rstrip("\n")
import os

if os.geteuid() == 0:
   # I'm root (or equivalent e.g., `setuid`)
import getpass

print('User name', getpass.getuser())
return subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, universal_newlines=True).stdout.read().strip().split("\n")
text_mode = encoding or errors or universal_newlines
def check_output(*popenargs, timeout=None, **kwargs):
    if 'stdout' in kwargs:
        raise ValueError('stdout argument not allowed, it will be overridden.')

    if 'input' in kwargs and kwargs['input'] is None:
        # Explicitly passing input=None was previously equivalent to passing an
        # empty string. That is maintained here for backwards compatibility.
        kwargs['input'] = '' if kwargs.get('universal_newlines', False) else b''

    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
**kwargs).stdout