2016-04-10 15 views
0

als neues Mitglied der Gemeinschaft, ich möchte direkt mit einer Frage zu verbinden .... Nachdem ich viele helfende und inspirierende Fragen und Antworten gefunden habe, bin ich jetzt auf einer Ebene Wo könnte nicht einmal Hilfe bei Google finden, unsere Frage, die sich auf uns bezieht.Codierung auf Apache mit Python CGI mit Zipfile.extract

Aber zurück zum Thema:

I mit einer Codierung Problem mit einem laufenden CGI Python-Skript nach einem Zip-Datei-Upload zu kämpfen, die ich weiter verarbeiten will:

def unzip_dir(zipname): 
zfile = zipfile.ZipFile(zipdir + zipname) 
for name in zfile.namelist(): 
    (dirname, filename) = os.path.split(name) 
    if filename.lower().endswith('.json'): 
     if not os.path.exists(unzipdir): 
     os.makedirs(unzipdir) 
     #LASTCHANGE - IDENTIFIED PROBLEM WITH UTF 8 and ZIPfiles in APACHE (Not reproduceable in any terminal) 
     zfile.extract(name, unzipdir) 
     shutil.move(wdir+'//'+unzipdir+'//'+name, unzipdir) 

das Laufen auf Unix-Systemen durch ssh funktioniert einwandfrei. Aber wenn ich das von Web über eine CGI Anruf starten laufen i in den folgenden Fehler:

<type 'exceptions.UnicodeEncodeError'>: 'ascii' codec can't encode character u'\xe4' in position 95: ordinal not in range(128) 
    args = ('ascii', u'analysis/Searchqueries-201650215T114640Z/Suchanf...nfragen/2007-01-01 Januar 2007 bis M\xe4rz 2007.json', 95, 96, 'ordinal not in range(128)') 
    encoding = 'ascii' 
    end = 96 
    message = '' 
    object = u'analysis/Searchqueries-201650215T114640Z/Suchanf...nfragen/2007-01-01 Januar 2007 bis M\xe4rz 2007.json' 
    reason = 'ordinal not in range(128)' 
    start = 95 

die sich hier befindet:

zfile.extract(name, unzipdir) 

Soweit ich aus früheren Berichten und Q & A verstehen die Das Problem hängt damit zusammen, wie Apache das CGI mit Python behandelt. Alle Versuche, die Kodierung auf Python-Ebene zu ändern (sys-Ein- und Ausgabeinformationen) oder dergleichen, führten zu nichts.

Ich habe auch versucht mit aller Art von Codierung des Namen Variable in der kritischen Linie zu kodieren, aber dies war in erster Linie auf die Tatsache führt, dass die gleiche Linie nicht den entsprechenden Eintrag in der Zip-Datei nicht mehr finden kann:

<type 'exceptions.KeyError'>: "There is no item named 'Suchanfragen/Suchanfragen/2007-01-01 Januar 2007 bis M\\x84rz 2007.json' in the archive" 
    args = (r"There is no item named 'Suchanfragen/Suchanfrage...Januar 2007 bis M\x84rz 2007.json' in the archive",) 
    message = r"There is no item named 'Suchanfragen/Suchanfrage...Januar 2007 bis M\x84rz 2007.json' in the archive" 

Ich habe auch die httpd.conf des Webservers überprüft, aber dies ist führend UTF-8.

Kann mir jemand helfen? Ich nehme an, es ist kein so triviales Thema, aber beschränkt auf mein Denken.

UPDATE: Ich beginne jetzt einige, wie nicht wissend, was ich gerade tue, und ich fürchte, ich stürze mein ganzes System zur Dummheit. Ich habe jetzt versucht, einen Wert in meiner httpd.conf-Datei mit dem Namen PassEnv in einigen virtuellen Host-Bereich ohne Erfolg nach dem Neustart hinzuzufügen.

UPDATE 2: Ich habe versucht, diese

sys.stdout = codecs.getwriter("utf-8")(sys.stdout) 

aber ehrlich gesagt ... keine Ahnung, was damit im Zusammenhang mit der Zip-Datei zu tun.

Antwort

0

Scheint wie ich einen Weg um das eigentliche Problem gefunden. Und mir geht es jetzt gut:

Ich vermeide die Codierung Probleme mit der Zipfile-Methode durch Entpacken der Dateien über Shell. Ich denke, ich erhöhe das Risiko durch diesen Prozess, aber ich riskiere es eher in diesem frühen Stadium, als keinen Fortschritt zu machen, was mich in den Wahnsinn getrieben hat. Hier

ist die geänderte Methode für Ihre Referenz:

def unzip_dir_v2(zipname): 
if not os.path.exists(unzipdir): 
    os.makedirs(unzipdir) 
syntaxer = 'unzip -o -j -q -d' + wdir + '/' + unzipdir + ' ' + wdir + '/' + zipdir + '' + zipname 
p = subprocess.Popen(syntaxer, shell=True) 
p.communicate() #now wait