2016-09-04 15 views
0

Ich führe mein Hauptskript in Python 3.5 mit der Spyder IDE, und ich möchte Funktionen aus einem Skript importieren, das nur in Python 3.4 funktioniert. So war ich empfohlen, diese zweite Skript als ein subProzess wie so laufen:UnicodeEncodeError nur wenn Skript als Subprozess ausgeführt wird

import subprocess 
cmd = [r'c:\python34\pythonw.exe', r'C:\users\John\Desktop\scraper.py'] 
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
stdout, stderr = p.communicate() 
print(stdout) 
print(stderr) 

Das Skript aufgerufen wird, ist ein Beispiel von NikolaiT Web Motor Scraper:

# -*- coding: utf-8 -*- 

import sys 
from GoogleScraper import scrape_with_config, GoogleSearchError 
from GoogleScraper.database import ScraperSearch, SERP, Link 

def basic_usage(): 
    # See in the config.cfg file for possible values 
    config = { 
     'SCRAPING': { 
      'use_own_ip': 'True', 
      'search_engines': 'baidu', 
      'num_pages_for_keyword': 3 
     }, 
     'keyword': '苹果', 
     'SELENIUM': { 
      'sel_browser': 'chrome', 
     }, 
     'GLOBAL': { 
      'do_caching': 'False' 
     } 
    } 

    try: 
     sqlalchemy_session = scrape_with_config(config) 
    except GoogleSearchError as e: 
     print(e) 

    # let's inspect what we got 
    link_list = [] 
    for serp in sqlalchemy_session.serps: 
     #print(serp) 
     for link in serp.links: 
      #print(link) 
      link_list.append(link.link) 
    return link_list 



links = basic_usage() 

print("test") 
for link in links: 
    print(link) 

Dieses Skript funktioniert gut, wenn es läuft in Python 3.4 IDLE IDE, aber wenn ich es als Subprozess wie oben ausgeführt, bekomme ich die folgenden UnicodeEncodeError von meinem Hauptskript gedruckt:

\ python34 \ scripts \ googlescraper \ GoogleScraper \ caching.py ", Zeile 413, in parse_all _cached_files store_serp_result (SERP, self.config)

Datei "C: \ python34 \ Scripts \ googlescraper \ GoogleScraper \ output_converter.py", Leitung 123, in store_serp_result pprint.pprint (Daten)

Datei „C: \ python34 \ lib \ pprint.py“, Zeile 52, in pprint printer.pprint (Objekt)

Datei "C: \ python34 \ lib \ pprint.py", Leitung 139, in pprint self._format (Objekt, self._stream, 0, 0, {}, 0)

Datei "C: \ python34 \ lib \ pprint.py", Linie 193, in _FORMAT Geld + 1, Rahmen, Level)

012.

Datei "C: \ python34 \ lib \ pprint.py", Linie 268, in _FORMAT write (rep)

Datei "C: \ python34 \ lib \ Kodierungen \ cp1252.py", Zeile 19, in encode Rückkehr codecs.charmap_encode (Eingang, self.errors, encoding_table) [0] UnicodeEncodeError: \ 'charmap \' Codec kann \ 't Zeichen in Position kodieren 1-2: Zeichen zuordnet undefined'

Warum sollte dies nur passiert wenn es indirekt läuft? Danke für jede Hilfe, Klärungsfragen oder Verbesserungsvorschläge bei der Formulierung meiner Frage.

Antwort

0

Kurz gesagt, Ihr Problem ist wie folgt:

  • Python IDE unterstützt UTF-8-Codierung, und das ist, warum Ihr aufgerufen Skript dort fein läuft.
  • Auf der anderen Seite, wenn Sie einen Unterprozess öffnen, da Sie unter Windows sind, verwenden Sie standardmäßig Windows1252-Zeichensatz, der einen Teil Ihrer Ausgabe nicht unterstützt.

Schnell Lösung: Wenn Sie das Skript als python foobar.py auf Windows-Kommandozeile aufrufen, Sie chcp 65001 vor dem Aufruf das Skript ausführen kann; Wenn Sie Spyder IDE verwenden, sollte eine Einstellung vorhanden sein, mit der Sie die Kodierung von Dateien/Projekten auf UTF-8 einstellen können.

(Sie können auch versuchen, # -*- coding: utf-8 -*- an die Spitze des Haupt Python-Skript hinzufügen.)

+0

Aha! Diese schnelle Lösung funktioniert, wenn Sie das zweite Python-Skript über die Befehlszeile ausführen! Könnte ich Sie bitten, klarzustellen, was Sie mit der Spyder-IDE meinen? Gibt es einen programmatischen Zusatz zu meinem Hauptcode, der "chcp 65001" vor dem Aufruf des Unterprozesses aktivieren könnte? – Cjp

+0

@Cjp Ich denke nicht, dass etwas Programmgesteuertes getan werden könnte - es ist eher ein Codierproblem mit Windows ... –

Verwandte Themen