我正在尝试打印UTF-8和cp866进程输出。
我的代码:
if "sendcmd " in message.text:
command = message.text.replace("sendcmd ", "")
process = os.popen(command)
answer = process.read()
#print(answer.decode('utf-8').encode('cp866'))
by = bytes(answer, 'utf-8')
print(type(by))
print(repr(by))
process.close()
在此之后我明白了:
<class 'bytes'>
b'b\'\\xe2\\x80\\x9c\\xd0\\xb1\\xd0\\x87\\xd2\\x90\\xd0\\xb5: \\xd0\\x8b\\xd0\\xb2\\xd0\\x87\\xd0\\xb0\\xc2\\xa0\\xd1\\x9e\\xc2\\xab\\xd2\\x90\\xc2\\xad \\xd0\\xb1\\xd0\\x81\\xd0\\x88\\xc2\\xad\\xc2\\xa0\\xc2\\xab \\xc2\\xa7\\xc2\\xa0\\xd1\\x9e\\xd2\\x90\\xd0\\xb0\\xd0\\xb8\\xd2\\x90\\xc2\\xad\\xd0\\x81\\xd0\\xbf \\xd0\\x87\\xd0\\xb0\\xc2\\xae\\xd0\\xb6\\xd2\\x90\\xd0\\xb1\\xd0\\xb1\\xd0\\xb3 "whatever.exe" \\xd0\\xb1 \\xd0\\x81\\xc2\\xa4\\xd2\\x90\\xc2\\xad\\xd0\\xb2\\xd0\\x81\\xd0\\xb4\\xd0\\x81\\xd0\\x84\\xc2\\xa0\\xd0\\xb2\\xc2\\xae\\xd0\\xb0\\xc2\\xae\\xc2\\xac 3720.\\n\'
我明白我需要将编码更改为cp866,但我不明白如何实现它=(
更新:此代码没有帮助:
uni = type(by), repr(by)
print(uni.encode('ascii', 'ignore'))
答案 0 :(得分:1)
== 20170821153121 DeviseCreateAdminUsers: migrating ===========================
-- create_table(:admin_users)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
SQLite3::SQLException: table "admin_users" already exists: CREATE TABLE "admin_users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "email" varchar DEFAULT '' NOT NULL, "encrypted_password" varchar DEFAULT '' NOT NULL, "reset_password_token" varchar, "reset_password_sent_at" datetime, "remember_created_at" datetime, "sign_in_count" integer DEFAULT 0 NOT NULL, "current_sign_in_at" datetime, "last_sign_in_at" datetime, "current_sign_in_ip" varchar, "last_sign_in_ip" varchar, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL)
/Users/admin/.rvm/gems/ruby-2.4.1/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:91:in `initialize'
/Users/admin/.rvm/gems/ruby-2.4.1/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:91:in `new'
/Users/admin/.rvm/gems/ruby-2.4.1/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:91:in `prepare'
/Users/admin/.rvm/gems/ruby-2.4.1/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:137:in `execute'
...
的{{1}}方法返回os.popen
,进程的输出会自动解码。 read
与str
类似,可以自定义;它返回原始subprocess.Popen
而不是os.popen
文字:
bytes
在内部,str
使用from subprocess import Popen, PIPE
if "sendcmd " in message.text:
...
process = Popen(command, stdout=PIPE)
answer = process.communicate()[0] # (stdout, stderr)
print(answer.decode('cp866'))
模块,您可能需要稍微更改os.popen
参数。检查subprocess
的{{3}}。