Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2011-05-29 23:07:00

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

[SOLVED] [python] commands.getoutput i UTF

Na początku napiszę, że nigdy nic nie pisałem w Pythonie. Znam dość dobrze shella, trochę perl-a i liznąłem JavaScript, ale z Pythonem dotychczas nie miałem do czynienia.
Zachciało mi się (a właściwie zostałem zmuszony) napisać własny plazmoid do KDE. Ma robić bardzo prostą rzecz: wypisywać do swojego wnętrza wyjście z wcześniej zdefiniowanego polecenia.

Znalazłem sobie taki przykład:
http://iaimz091.informatik.uni-mainz.de/site/?p=1

Zrobiłem wszystko wedle instrukcji, zamieniając tylko w odpowiednim miejscu "uptime" na moje polecenie (zrobiony dawno temu skrypt w bash-u). Zainstalowałem, wszystko poszło OK. Po uruchomieniu jednak zamiast polskich znaków diakrytycznych mam krzaki. Najpierw myślałem że to kwestia fontu, ale gdy udało mi się go zmienić na taki, który na pewno polskie znaki ma, nic się nie poprawiło.

Gdy w skrypcie jest linijka:

Kod:

text = commands.getoutput(cmd).encode('utf8')

to przy uruchomieniu skryptu otrzymuję:

Kod:

Traceback (most recent call last):
  File "/usr/share/kde4/apps/plasma_scriptengine_python/pyappletscript.py", line 117, in paintInterface
    self.pyapplet.paintInterface(painter, option, contentsRect)
  File "/home/minio/sources/uptime/contents/code/main.py", line 43, in paintInterface
    text = commands.getoutput(cmd).encode('utf8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 25: ordinal not in range(128)

wnioskuję — może niepoprawnie — że Python wyjście tego polecenia tratuje jako ciąg znaków ASCII i stąd cały problem.

Pytanie więc brzmi: co mam zrobić, żeby przekonać go, że ten ciąg znaków jednak jest zakodowany w UTF-8?

(Wszędzie indziej w KDE, także w już istniejących plazmoidach, polskie znaki wyświetlają się poprawnie, dlatego przypuszczam że to jednak wina Pythona.)

Ostatnio edytowany przez Minio (2011-05-30 15:20:07)

Offline

 

#2  2011-05-30 15:19:27

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: [SOLVED] [python] commands.getoutput i UTF

Generalnie miałem rację.
Zamieniłem commands (który rzekomo jest już deprecated) na subprocess i jakoś bangla. Pełen kod plasmoida (może się komuś przyda):

Kod:

# -*- coding: utf-8 -*-
# myPlasmoid/contents/code/main.py

#import kde and qt specific stuff
from PyQt4.QtCore import *
from PyQt4 import QtGui
from PyKDE4.plasma import Plasma
from PyKDE4 import plasmascript

#import commands for executing shell commands
from subprocess import Popen, PIPE

#Plasmoid gained by inheritance
class myPlasmoid(plasmascript.Applet):

    #constructor
    def __init__(self,parent,args=None):
        plasmascript.Applet.__init__(self,parent)

    #done once when initiating
    def init(self):

        #disable settings dialog
        self.setHasConfigurationInterface(False)
        #set size of Plasmoid
        self.resize(450, 45)
        #set aspect ratio mode
        self.setAspectRatioMode(Plasma.IgnoreAspectRatio)
        #set timer interval in ms (1000=1s)
        self.startTimer(2000)

    #done when timer is resetted
    def timerEvent(self, event):

        #call draw method
        self.update()

    #draw method
    def paintInterface(self, painter, option, rect):

        #command to be executed in shell
        cmd = "logout.sh --print-only"
        stdout = Popen(cmd, shell=True, stdout=PIPE).stdout
        text = stdout.read().decode('utf8')

        #set pen color and draw text
        painter.save()
        painter.setPen(Qt.black)
        painter.setFont(QtGui.QFont("Inconsolata", 12))
        painter.drawText(rect, Qt.AlignLeft, text)
        painter.restore()

def CreateApplet(parent):
    return myPlasmoid(parent)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)