2012-04-13 11 views
0

Im Grunde bin ich mapreduce laufen, also werde ich in den Reducer pipes. Worauf ich Probleme habe, ist, einen Verzeichnispfad anzugeben, den ich mit os.listdir verwenden werde, um im Wesentlichen alle Dateien in diesem Verzeichnis zu erhalten und dann zu berechnen. Aber ich weiß, ich will nur, was im letzten Verzeichnis ist und nicht die Unterverzeichnisse auf derselben Ebene. Ich könnte auch fileinput() verwenden.Kann ich Stdin in Verbindung mit Argv verwenden, wenn ich eine Python-Datei verwende, die in eine andere piped ist?

Ich denke, dass ich stdin hier falsch verwenden kann, hängt davon ab, ob es von der Befehlszeile sein muss oder ob es indirekt von der Befehlszeile sein kann.

Das war meine Eingabezeile: "./path1/path2/path3" ./map.py | sortieren | ./red.py

Was ich als Fehler bekam zu tun, was ich tun möchte, ist -bash, kein Verzeichnis ./pythonfile.py

Python 2.7.2

Dies ist, was ich tue:

def func(): 
    path = sys.argv[0] 
    return [filenames for filenames in os.listdir(path)if os.path.isfile(os.path.join(path,filenames))] 

if func() is not None: 
    for file in func(): 
     sys.stdin.read() 
     ...etc.. 

Antwort

1
"./path1/path2/path3" ./map.py | sort | ./red.py 

das bash das Programm ./path1/path2/path3 mit dem Argument ./map.py auszuführen erzählt. Dies ist fast sicher nicht das, was Sie tun möchten.

path = sys.argv[0] 

Dies ist der Name des Skript - das erste Element der argv[] ist, durch Konvention, der Name des Programms, das ausgeführt wird. Siehe dazu:

$ cat echo.py 
#!/usr/bin/python 
import sys 
print sys.argv[0] 
$ chmod 755 echo.py 
$ ./echo.py 
./echo.py 
$ 

Vielleicht, was Sie tun sollen war echo die Zeichenfolge an das Skript:

echo path1/path2/path3 | ./map.py | sort | ./red.py 

Aber dann könnte man nicht verwenden, um die argv[] Array leicht an, es zu bekommen. In der Tat ist es sehr schwer richtig mehrere Pfadnamen von einem Freiform-Eingabe wie folgt zu analysieren, so würde ich es ganz vermeiden, und die Namen wie Argumente übergeben:

./map.py path1/path2/path3 /a/s/econd/pathname 

Sie laufen könnte über alle Pfade übergeben als Argumente mit etwas wie folgt:

>>> a=["nothing", "passwd", "shadow"] 
>>> [f for f in a[1:]] 
['passwd', 'shadow'] 
>>> import os 
>>> [f for f in a[1:] if os.path.isfile(f)] 
['passwd', 'shadow'] 
>>> 
+0

was ist der Zweck des Doppelpunkts? Vielen Dank, aber ich bin mir sicher, dass ich im Wesentlichen den Pfad zum Skript wiedergeben möchte. Wie gehe ich also vor, um mehrere Pfadnamen zu analysieren, um mein letztes Verzeichnis voller Dateien zu erreichen? Ich bin mir nicht sicher, ob ich dein Beispiel mit Tupeln oder Listen verstehe, weil ich nicht wissen werde, welche Dateinamen übergeben werden. Was Argumente angeht, kann ich die Pipe trotzdem so verwenden, wie ich es brauche, wenn ich es so benutze Sind die Argumente auf die gleiche Weise erhalten? Via Stdin oder Argv? – Nightvein

+1

Ah, das '[1:]' war, den ersten Eintrag wegzulassen, da es nur der Name des Skripts ist. (Nicht der Pfad.) Ich muss laufen, aber bedenke einfach, dass ich 'a' für einfaches Testen verwendet habe, Ihre Benutzer werden Werte über' argv [1] ',' argv [2] ', etc. – sarnold