Android 在python 3.4中对字符串进行编码
在Python3.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
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