[Python-de] subprocess und encoding...

Jens Diemer python_gmane at jensdiemer.de
Mon Jun 19 11:59:00 CEST 2006


Diez B. Roggisch schrieb:
>> Ansonsten Probiere ich einfach ["ASCII", "latin1", "utf8"] durch.

> Ohne das du uns Daten und/oder code zeigst kann man das nicht einschätzen.

Gut das du das geschrieben hast... Ich hab nämlich den Code mal zusammen 
gefasst und ein paar Debug-Ausgaben eingebaut... Und es hat sich 
gezeigt, das durch einen dummen Schreibfehler gar nicht die Codecs 
durchprobiert wurden, sondern nur drei mal hintereinander mit ASCII 
getestet wurde :( Zu dumm...

Nun klappt es mit utf8! Der Vollständigkeitshalber aber hier mal der Code:
============================================================================
#!/usr/bin/python
# -*- coding: UTF-8 -*-

print "Content-type: text/html; charset=utf-8\r\n\r\n"
import cgitb;cgitb.enable()

import sys, subprocess

command = (
     "mysqldump --default-character-set=utf8 --compact"
     " -uUserName -pPassword -hlocalhost DatabaseName"
     " --tables PyLucid_styles"
)
work_dir = "/usr/bin"
#~ command = "ls -al && echo TEST: äöüß"
#~ work_dir = "."

process = subprocess.Popen(
     command,
     cwd = work_dir,
     shell=True,
     stdout=subprocess.PIPE,
     stderr=subprocess.PIPE,
)
#~ process.wait()
out_data = process.stdout.read()

print "<pre>"
print "process.stdout.encoding:", process.stdout.encoding
encoding = sys.stdin.encoding or sys.getdefaultencoding()
print "encoding:", encoding

encodings = [encoding, "utf8", "latin1"]

def make_unicode(encodings, out_data):
     print encodings
     for encoding in encodings:
         print "Test encoding:", encoding
         try:
             out_data = unicode(out_data, encoding, errors="strict")
         except UnicodeError, e:
             print "Fail:", e
             continue
         else:
             print "encoding OK:", encoding
             return out_data
     print "no encoding found!"
     return out_data

out_data = make_unicode(encodings, out_data)

print "-"*80
print out_data.encode("utf8")

print "</pre>"
============================================================================

Ich frag mich nur, wie ich an "utf8" herankommen kann. Denn es sieht so aus:

sys.stdin.encoding:
     None
sys.stdout.encoding:
     None
sys.stderr.encoding:
     None
sys.getdefaultencoding():
     ascii
sys.getfilesystemencoding():
     ANSI_X3.4-1968
locale.getlocale():
     (None, None)
locale.getdefaultlocale():
     (None, None)
locale.getpreferredencoding():
     ANSI_X3.4-1968

Also nirgends brauchbare Daten...

OK in meinem Fall kann ich utf8 aus dem mysqldump Programm-Parameter 
'--default-character-set=' ableiten. Aber so generell... Welches 
encoding nutzt subprocess???

Wobei... ...such... ...such... Das Problem hatte ich schonmal:
http://python.net/pipermail/python-de/2006q2/thread.html#7661
Da ist wohl mein Linux nicht richtig eingestellt!

Wobei es bei Alturo noch schlimmer aussieht:

sys.stdin.encoding:
     Error: Object has no .encoding!
sys.stdout.encoding:
     Error: Object has no .encoding!
sys.stderr.encoding:
     Error: Object has no .encoding!
sys.getdefaultencoding():
     ascii
sys.getfilesystemencoding():
     Error: 'module' object has no attribute 'getfilesystemencoding'
locale.getlocale():
     (None, None)
locale.getdefaultlocale():
     (None, None)
locale.getpreferredencoding():
     Error: 'module' object has no attribute 'getpreferredencoding'

Wobei da auch Python uralt ist:
Python v2.2.1 (#1, Aug 25 2004, 16:56:05) [GCC 2.95.4 20011002 (Debian 
prerelease)]

Naja, dann bleib ich einfach beim dummen Probieren...


-- 
Mfg.

Jens Diemer


----
CMS in pure Python CGI: http://www.pylucid.org