Domanda

Come posso fare in modo che il seguente liner stampi ogni file tramite Python?

python -c "import sys;print '>>',sys.argv[1:]" | dir *.*

In particolare, vorrei sapere come eseguire il pipe in un python -c. Sono state accettate le risposte DOS o Cygwin.

È stato utile?

Soluzione

Puoi leggere i dati reindirizzati in uno script Python leggendo sys.stdin. Ad esempio:

ls -al | python -c "import sys; print sys.stdin.readlines()"

Non è del tutto chiaro cosa vuoi fare (forse sono stupido). La confusione deriva dal tuo esempio che sta eseguendo il piping dei dati da uno script Python.

Altri suggerimenti

python -c "import os; print os.listdir('.')"

Se vuoi applicare una formattazione come quella che hai nella tua domanda,

python -c "import os; print '\n'.join(['>>%s' % x for x in os.listdir('.')])"

Se vuoi usare una pipe, usa xargs :

ls | xargs python -c "import sys; print '>>', sys.argv[1:]"

o backtick:

python -c "import sys; print '>>', sys.argv[1:]" `ls`

Se si desidera stampare tutti i file :

find . -type f

Se si desidera stampare solo i file della directory corrente

find . -type f -maxdepth 1

Se desideri includere " > > " prima di ogni riga

find . -type f -maxdepth 1 | xargs -L 1 echo ">>"

Se non desideri lo spazio tra " > > " e $ percorso da echo

find . -type f -maxdepth 1 | xargs -L 1 printf ">>%s\n"

Questo è tutto usando cygwin, ovviamente.

ls | python -c "import sys; print sys.stdin.read()"

basta leggere stdin normalmente per i tubi

  

però vorrebbe sapere come convogliare

Avevi il tubo nella direzione sbagliata, se volessi alimentare l'output di "dir" in Python, "dir" dovrebbe essere sulla sinistra. ad esempio:.

dir "*.*" | python -c "import sys;[sys.stdout.write('>>%s\n' % line) for line in sys.stdin]"

(L'hacking con la comprensione dell'elenco è dovuto al fatto che non è consentita un'istruzione "for" che introduce un blocco su una riga dopo un punto e virgola.)

Chiaramente la soluzione nativa di Python ("os.listdir") è molto meglio in pratica.

  

In particolare, vorrei sapere come eseguire il pipe in un python -c

vedi risposta di cobbal

il piping attraverso un programma è trasparente dal punto di vista del programma, tutto ciò che il programma sa è che sta ricevendo input dal flusso di input standard

In generale, un comando shell del modulo

A | B

reindirizza l'output di A come input di B

quindi se A sputa " asdf " allo standard output, quindi B ottiene "asdf" nel suo input standard

il flusso di input standard in python è sys.stdin

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top