[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