2017-02-27 1 views
1

Der Versuch läuft das Google-API-Client zu verwenden, habe ich einen Fehler bekommen, dass viele andere bekommen haben:eine neuere Version von sechs als 1.4.1, wenn ein Python-Skript

AttributeError: 'Module_six_moves_urllib_parse' object has no attribute 'urlencode'

ich jeden versucht haben, Lösung in Stackoverflow, GitHub und anderen Orten, einschließlich:

1) von this thread, den Pfad in dem eigentlichen Code zu ändern:

import sys 
sys.path.insert(1, '/Library/Python/2.7/site-packages') 

2) von this thread, den Python-Pfad in der .bashrc und Bash_profile Dateien ändern:

pip show six | grep "Location:" | cut -d " " -f2 
export PYTHONPATH=$PYTHONPATH:<pip_install_path> 
source ~/.bashrc 

3) und von this thread, meinen Google api-Client 1.3.2 (oder zumindest der Herabstufung versuchen zu).

Ich bin neu in der Programmierung, so dass dies ein grundlegendes Problem sein könnte, aber ich habe Tage damit verbracht, Fehler zu beheben und vergebens. Es scheint, dass egal, was ich tue, die alte 1.4 Version von sechs verwendet wird. Jede Hilfe, die Sie zur Verfügung stellen könnten, wäre sehr dankbar!

EDIT: Volltraceback:

Traceback (most recent call last): 
    File "/Users/zachgoldfine/PycharmProjects/FirstTry/GetAroundRentalSpreadsheetRead.py",  line 71, in <module> 
    spreadsheetId=spreadsheetId, range=rangeName1).execute() 
    File "/Library/Python/2.7/site-packages/oauth2client/util.py", line 129, in positional_wrapper 
    return wrapped(*args, **kwargs) 
    File "/Library/Python/2.7/site-packages/googleapiclient/http.py", line 836, in execute 
    method=str(self.method), body=self.body, headers=self.headers) 
    File "/Library/Python/2.7/site-packages/googleapiclient/http.py", line 162, in _retry_request 
    resp, content = http.request(uri, method, *args, **kwargs) 
    File "/Library/Python/2.7/site-packages/oauth2client/transport.py", line 186, in new_request 
    credentials._refresh(orig_request_method) 
    File "/Library/Python/2.7/site-packages/oauth2client/client.py", line 761, in _refresh 
    self._do_refresh_request(http) 
    File "/Library/Python/2.7/site-packages/oauth2client/client.py", line 774, in _do_refresh_request 
    body = self._generate_refresh_request_body() 
    File "/Library/Python/2.7/site-packages/oauth2client/client.py", line 716, in _generate_refresh_request_body 
    body = urllib.parse.urlencode({ 
AttributeError: 'Module_six_moves_urllib_parse' object has no attribute  'urlencode' 
+0

Könnten Sie die vollständige Rückverfolgung sind, so können wir aus der Datei (en) der Fehler entsteht sehen? – Evert

+0

@Evert hat den vollständigen Traceback hinzugefügt –

+0

Ich sehe eine Erwähnung von Pycharm im Traceback. Läuft du Sachen durch pycharm? Das könnte ein Problem sein. Ich bin mit pycharm nicht vertraut, aber wenn Sie es vermeiden können und versuchen, die relevanten Skripte von der Befehlszeile aus auszuführen, könnte das helfen, die Problemursache einzugrenzen. – Evert

Antwort

0

Unter der Annahme, es ist in der Tat ein Problem mit der sechs-Version, hier ist eine Möglichkeit, installieren sechs und der Lage sein, die neu installierte Version zu verwenden.

Wichtiger Hinweis: Dies funktioniert nur von Ihrem Benutzerkonto; nicht von einem anderen Konto.
Auf der sicheren Seite: Dies ändert nichts an der Python-Systemumgebung, dh Systemskripte, die Python verwenden können, werden weiterhin die ältere pip-Version verwenden.

Zuerst kehren Sie die drei obigen Schritte um. Insbesondere sys.path manuell in einem Skript zu ändern sollte wirklich sehr selten notwendig sein.

Verwenden Sie dann die --user Option, die eine lokale Version installiert, die Python (wenn von diesem Benutzer ausgeführt) wird automatisch zuerst abholen. Um sicherzustellen, dass die Python-Executable Sie entspricht dem Pip-Modul und (später) die installierte sechs-Modul verwenden, verwenden Sie die folgenden Schritte aus:

python -m pip install six --user 

wo python etwas anderes etwas sein kann, wenn man nicht das passieren verwenden System Python (zB z/usr/local/bin/python , or python3 , etc).
There is no need for
sudo` oder ähnliches.

Wenn pip beklagt, dass die Anforderung ist bereits auf dem neuesten Stand (es sollte nicht, sonst würden Sie nicht bekommen haben die obigen Probleme), versuchen Sie:

python -m pip install six --user --upgrade --force 

Sobald Sie fertig sind, können Sie überprüfen $HOME/Library/Python/x.y/lib/python/site-packages, um zu sehen, wenn Sie die richtige Version von sechs dort sehen. Dies ist Ihr lokales Benutzerbibliotheksverzeichnis, nicht das Systemverzeichnis. x.y ist wahrscheinlich 2,7, aber überprüfen Sie, dass python tatsächlich diese Version ist.


Das Problem kann auch mit dem Google API-Client sein. Ich weiß nicht, ob das eine Pip-Installation, aber sonst könnte man etwas ähnliches wie für sechs versuchen:

python -m pip install <google-api-client> --user (--upgrade --force) 
+0

Vielen Dank für Ihre Antwort. Ich folgte Ihren Schritten, indem ich zunächst die Bashrc-Add-Ons löschte und dann das sys.path.insert-Bit löschte. Als ich deinen ersten Vorschlag ausprobierte, bekam ich "Anforderung bereits erfüllt ...", also habe ich deinen zweiten Vorschlag mit der zusätzlichen --upgrade --force ausprobiert, und das schien erfolgreich eine verbesserte Version 6 (Version 1.10) zu installieren. Als nächstes überprüfte ich das Verzeichnis, das Sie vorgeschlagen haben, und ich habe 'keine solche Datei oder Verzeichnis:/Users/zachgoldfine/Bibliothek/Python/2.7/lib/python/site-packages' –

+0

Von dem, was ich verstehe, scheint es wie Google API Client benötigt sechs 1,6 oder höher. Aber wenn ich das Skript ausführe, scheint es jedes Mal die Version 1.4 von sechs zu verwenden, was den Fehler verursacht. Wie kann ich Python/den Interpreter (Entschuldigung, wenn mein Vocab hier ist) auf die aktualisierte Version von sechs statt der älteren zeigen? –

+0

@ZachGoldfine Zwei Tests: 1/Können Sie sehen, ob das Verzeichnis '$ HOME/.local/lib/python2.7/site-packages' existiert? 2/können Sie einfach Python selbst ausführen und sechs an der Python-Eingabeaufforderung importieren, dann prüfen Sie die Version: '>>> import six; sechs .__ version__' sollte es tun. – Evert

Verwandte Themen