簡體   English   中英

python腳本會引發錯誤,具體取決於如何從shell調用它

[英]python script raises an error depending on how it was called from the shell

我正在使用這個小工具將Skype的聊天數據庫轉換為類似IRC的聊天導出形式的可讀性更高的表示形式。 之所以這樣做,是因為我保存了一些舊的Skype聊天的.db文件,現在我正嘗試從中提取內容。 我開始工作的那一部分,但是現在有些事情我無法弄清楚為什么會發生。

如果我以./skype2text.py file.db chat_partner_id身份調用腳本,則可以正常工作,並將具有指定用戶ID的聊天記錄輸出到stdout

完成該工作后,我想將輸出保存到文件中,而不是將其打印到stdout中,所以我只是將它作為echo $(./skype2text.py file.db chat_partner_id)只是為了了解它的運行方式,因此我可以重定向將其保存到文件中,這就是奇怪的事情發生的時間。 它打印第一個聊天行並崩潰。 (並且在此之后也完全忽略換行符)。

$ echo $(./skype2text.py "main 1.db" miya)
Traceback (most recent call last):
File "./skype2text.py", line 62, in <module>
  print(u"<" + row[0] + u"> " +  unicode(parser.unescape(unicode(row[1]))))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 47: ordinal not in range(128)
<Luda> C'est moi <ss type="wink">;)</ss> <MiYa> None

這是代碼

#!/usr/bin/env python2
# charset=utf-8

from __future__ import print_function

import sys
import sqlite3
import os.path
import HTMLParser


def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)

def eprint_use():
    eprint("usage : " + sys.argv[0] + " <file.db> <partner's skype ID> [output file]")

# actual code here
# first of all check argv and print the help message if it's wrong

if len(sys.argv) < 3 or len(sys.argv) > 4:
    eprint_use()

else:
    database_path = sys.argv[1]
    partner_id = sys.argv[2]
    output_path = sys.argv[3] if len(sys.argv) == 4 else partner_id + '.txt'

    if not os.path.isfile(database_path):
        sys.exit('the file %s does not exist' % (database_path))

    connection = sqlite3.connect(database_path)
    cursor = connection.cursor()

    parser = HTMLParser.HTMLParser()

    cursor.execute("SELECT from_dispname,body_xml FROM Messages WHERE dialog_partner='" + partner_id + "' ORDER BY timestamp")

    for row in cursor.fetchall():
        print(u"<" + row[0] + u"> " +  unicode(parser.unescape(unicode(row[1]))))

我在頂部省略了大多數沒有用的評論,因此這里的第62行是最后一行。

我可能在某些時候對SQL查詢做錯了。 我也沒有真正檢查輸入是否有效,但這不是重點。 為什么會這樣? 為什么調用腳本會以不同方式導致崩潰,盡管它可以完美地自己運行呢? 我也檢查了sys.argv ,在兩種情況下它都包含相同的內容。 同樣是的,我有一個未使用的output_path變量,我將根據第三個參數調整輸出,如果它包含一個文件名,我暫時將其輸出到文件。 最奇怪的是為什么它會導致unicode異常?

$ bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
$ python2 --version
Python 2.7.10

可能默認的編碼在第一種情況下為utf-8(有效時),在第二種情況下為ascii(發生UnicodeEncodeError時)

也許嘗試:

for row in cursor.fetchall():
    res = u"<" + row[0] + u"> " +  unicode(parser.unescape(unicode(row[1])))
    print(res.encode('utf-8'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM