Ich verwende die (ehrfürchtige) mrjob -Bibliothek von Yelp, um meine Python-Programme in Amazon Elastic Map Reduce auszuführen. Es hängt vom Subprozess in der Standard-Python-Bibliothek ab. Von meinem Mac läuft python2.7.2, alles funktioniert wie erwartet
Als ich jedoch den gleichen Code auf Ubuntu LTS 11.04 auch mit python2.7.2 verwendete, stieß ich auf etwas Seltsames:
mrjob lädt den Job und versucht dann, mit seinen untergeordneten Prozessen unter Verwendung des Unterprozesses zu kommunizieren, und generiert diesen Fehler:
%Vor%Dies scheint ein Problem mit dem Subprozess und nicht mit mrjob zu sein.
Ich habe in /usr/lib/python2.7/subprocess.py gegraben und festgestellt, dass es während des Imports läuft:
%Vor%Durch das Bearbeiten habe ich überprüft, dass es wirklich _has_poll == True gesetzt hat. Und das ist richtig; leicht in der Befehlszeile verifiziert.
Wenn jedoch die Ausführung mit Popen._communicate_with_poll fortgesetzt wird, hat sich das Auswahlmodul geändert! Dies wird durch direktes Drucken von dir (select) erzeugt, bevor versucht wird, select.poll () zu verwenden.
%Vor%kein Attribut namens "poll"!?!? Wie ist es weggegangen?
Also habe ich hash_poll = False programmiert und dann arbeitet mrjob glücklich mit seiner Arbeit weiter, führt meinen Job in AWS EMR aus, mit Subprocess unter Verwendung von communicate_with_select ... und ich stehe mit einer handmodifizierten Standardbibliothek fest ...
Irgendwelche Tipps? : -)
Ich hatte ein ähnliches Problem und es stellt sich heraus, dass gevent das eingebaute select
Modul durch gevent.select.select
ersetzt, welches keine poll
Methode hat (wie es eine Blockierungsmethode ist).
Aus irgendeinem Grund puffert gevent jedoch standardmäßig nicht subprocess
, das select.poll
verwendet.
Eine einfache Lösung ist das Ersetzen von subprocess
durch gevent.subprocess
:
Wenn Sie dies vor dem Importieren der mrjob-Bibliothek tun, sollte es gut funktionieren.
Entschuldige, dass ich statt eines Kommentars eine vollständige Antwort geschrieben habe, sonst würde ich den Code-Einzug verlieren.
Ich kann Dir nicht direkt helfen, da etwas sehr eng mit Deinem Code verbunden zu sein scheint, aber ich kann Dir helfen, herauszufinden, dass man, indem man sich darauf verlässt, dass Python-Module ein beliebiges Objekt sein können, so etwas ausprobieren kann:
%Vor%und Sie erhalten eine Ausgabe wie:
%Vor%Durch Aufruf von replaceSelect () in Ihrem Code sollten Sie in der Lage sein, eine Rückverfolgung von zu erhalten, wo jemand poll () löscht, damit Sie verstehen, warum.
Ich hoffe, dass meine FakeModule-Implementierung gut genug ist, andernfalls müssen Sie sie möglicherweise ändern.
Tags und Links python subprocess mrjob